我有一个应用程序,因为你不能在我正在使用的主线程上进行网络操作AsyncTask
,所以问题是一旦我开始活动execute()
,然后AsyncTask
我finish()
就开始活动,也许用户会finish()
使用整个应用程序,所以我我想知道的是:
- 只要在应用程序运行时被调用,即使应用程序关闭,也总是会
AsyncTask
完成?doInBackground()
onPostExecute()
execute()
我有一个应用程序,因为你不能在我正在使用的主线程上进行网络操作AsyncTask
,所以问题是一旦我开始活动execute()
,然后AsyncTask
我finish()
就开始活动,也许用户会finish()
使用整个应用程序,所以我我想知道的是:
AsyncTask
完成?doInBackground()
onPostExecute()
execute()
您将能够对此进行测试。是的,确实如此。如果调用了执行,您可以看到 Asynctask 仍将执行,除非它对前台或 UI 相关的操作。(它可能会导致启动器崩溃)。
但是,如果它靠近系统。它可能会或可能不会继续执行该方法。我已经在这里测试并回答了。回复评论: 测试:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Worker().execute();
}
private class Worker extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... arg0) {
Log.i("SomeTag",
"start do in background at " + System.currentTimeMillis());
String data = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(
"https://stackoverflow.com/questions/tagged/android");
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
data = EntityUtils.toString(httpEntity);
Log.i("SomeTag",
"doInBackGround done at " + System.currentTimeMillis());
} catch (Exception e) {
}
return data;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.i("SomeTag", System.currentTimeMillis() / 1000L
+ " post execute \n" + result);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("SomeTag", System.currentTimeMillis() / 1000L + " onDestory()");
}
04-24 21:42:57.981: I/SomeTag(5961): start do in background at 1366854177994
04-24 21:43:00.974: I/SomeTag(5961): 1366854180 onDestory()
04-24 21:43:02.946: I/SomeTag(5961): doInBackGround done at 1366854182946
04-24 21:43:02.946: I/SomeTag(5961): 1366854182 post execute
04-24 21:43:02.946: I/SomeTag(5961): <!DOCTYPE html>
04-24 21:43:02.946: I/SomeTag(5961): <html>
04-24 21:43:02.946: I/SomeTag(5961): <head>
04-24 21:43:02.946: I/SomeTag(5961):
04-24 21:43:02.946: I/SomeTag(5961): <title>Newest 'android' Questions - Stack Overflow</title>
04-24 21:43:02.946: I/SomeTag(5961): <link rel="shortcut icon" href="http://cdn.sstatic.net/stackoverflow/img/favicon.ico">
//....
onPostExecute()
从 UI 线程调用 - 因此如果 UI 线程不再运行,它将不会继续运行。但是doInBackGround()
,它是从一个单独的工作线程运行的,因此它将一直运行直到完成(或者如果 JVM 进程被操作系统杀死,这也是一种可能性)。请注意,仅建议将 AsyncTasks 用于较短的 UI 绑定后台任务,而不是长时间运行的后台工作(几秒钟)。
简而言之,您不能假设它会继续运行,也绝对不能假设它会发布进度或调用onPostExecute()
。
当您在 Activity 上调用 finish() 时,Activity 会被销毁,但主线程不会。[注意:活动在主线程上运行。活动不是主线程。]
因此,后台线程上的 doInBackground() 和主线程上的 onPostExecute() 将被执行。但是,如果 onPostExecute() 执行任何与 UI 相关的任务,您将获得 ANR,因为此时没有 UI。例如,如果您只是在 onPostExecute() 中打印 Log.d() 语句,则该语句将在 Logcat 中可见。
** 只有当进程处于活动状态且未被 Android Low Memory Killer 杀死时,这些才是可能的。
您可以轻松地对此进行测试,只需doInBackground()
延长持续时间,例如添加Thread.sleep(5000)
然后尝试各种场景:
onPostExecute()
如果您持有对周围 Activity 的引用(如 UI 元素) ,您可能会导致内存泄漏或应用程序崩溃,那不再是“活着的”了。onPostExecute()
doInBackground()
将不会完成。如果您只是使用启动线程也是如此new Thread(new Runnable() {...