0

我正在为客户端构建一个应用程序,以从服务器获取问题并回答它,如果服务器没有问题,我想转到新屏幕并打印几分钟后重试的消息AsyncTask,如果服务器没有,则会收到问题'没有问题,它会在响应的标题中发送一个isFindAQuestion带有值的标题false,这是客户端上的代码,以确保如果false我在 LogCat 上打印并且我看到了message = false,但我的问题是即使我开始新的活动使用intent,此活动继续工作并向我显示异常,这是null pointer exception因为onPostExceute将采用参数null并尝试处理它,我将其放在finish()末尾false statement但未完成活动

if (response.getFirstHeader("isFindAQuestion").getValue()
                        .toString().equals("false")) {
                    Log.d("message", "false");
                    Bundle basket = new Bundle();
                    basket.putString("Message", "sorry no enought questions");
                    Intent goToAnswerQuestion = new Intent(AnswerQuestion.this,
                            FinishTime.class);
                    goToAnswerQuestion.putExtras(basket);
                    startActivity(goToAnswerQuestion);
                    finish();

                } 

编辑

是因为AsyncTask正在工作,thread所以如果活动完成,该线程将继续工作?如果是这样,我该如何停止该线程?

4

1 回答 1

1

doInBackground 不在 UI 线程中执行,而是在单独的线程中执行:

在 onPreExecute() 完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。

如果您想停止后台操作并在 UI 线程上执行一些活动,最好调用 cancel(),然后在 onCancelled 回调中执行您想要的所有内容,该回调在 UI 线程上执行。

从 AsyncTask 文档:

可以通过调用 cancel(boolean) 随时取消任务。调用此方法将导致对 isCancelled() 的后续调用返回 true。调用此方法后,将在 doInBackground(Object[]) 返回后调用 onCancelled(Object),而不是 onPostExecute(Object)。为了确保尽快取消任务,如果可能(例如在循环内),您应该始终从 doInBackground(Object[]) 定期检查 isCancelled() 的返回值。

protected void onCancelled (Result result)

在调用 cancel(boolean) 并且 doInBackground(Object[]) 完成后在 UI 线程上运行。默认实现只是调用 onCancelled() 并忽略结果。如果您编写自己的实现,请不要调用 super.onCancelled(result)。

于 2012-07-10T13:51:14.817 回答