我正在为客户建立一个应用程序,以便从服务器获取问题并回答问题,如果服务器没有问题我想要进入新屏幕并打印出几分钟后再次尝试的消息,那么问题就在于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
正在处理{{1}},所以如果活动结束,该线程会继续工作吗?如果是这样我怎么能阻止那个线程?
答案 0 :(得分:1)
doInBackground不在UI线程中执行,而是在一个单独的线程中执行:
在onPreExecute()之后立即在后台线程上调用完成执行。此步骤用于执行背景 计算可能需要很长时间。
如果你想停止后台操作并在UI线程上执行一些活动,最好是调用cancel()然后在UI线程上执行的onCancelled回调中执行你想要的所有东西。
来自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)。