即使应用程序被销毁,AsyncTask也会一直运行?

我有一个应用程序,因为你不能在主线程上进行网络操作我正在使用AsyncTask ,所以问题是我execute() AsyncTask之后我就finish()活动,也许用户将finish()整个应用程序,所以我想知道的是:

  1. 即使应用程序关闭,只要在应用程序运行时调用了execute()AsyncTask总是完成doInBackground()onPostExecute()

你将能够测试这个。 是的确如此。 如果调用了execute,你可以看到Asynctask仍然会执行,除非它对forground或UI做了些什么。 (它可能导致发射器崩溃)。

但是,如果它被系统关闭了。 它可能会也可能不会继续执行该方法。 我已经在这里测试过并回答了 回复评论:经过测试:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Worker().execute(); } private class Worker extends AsyncTask { @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):  04-24 21:43:02.946: I/SomeTag(5961):  04-24 21:43:02.946: I/SomeTag(5961):  04-24 21:43:02.946: I/SomeTag(5961): 04-24 21:43:02.946: I/SomeTag(5961): Newest 'android' Questions - Stack Overflow 04-24 21:43:02.946: I/SomeTag(5961):  //.... 

从UI线程调用onPostExecute() – 因此如果UI线程不再运行,它将不会继续运行。 但是, doInBackGround()是从一个单独的工作线程运行的,因此它将一直运行直到完成(或者如果JVM进程被操作系统杀死,这也是可能的)。 请注意,AsyncTasks仅建议用于较短的UI绑定后台任务,而不是长时间运行的后台工作(几秒钟)。

简而言之,你不能假设它会继续,并且绝对不会假设它会发布它的进度或调用onPostExecute()

当你在Activity上调用finish()时,Activity被销毁,但主线程却没有。 [注意:活动在主线程上运行。 活动不是主线程。 ]

因此,将在后台线程上执行doInBackground()并在主线程上执行onPostExecute()。 但是,如果onPostExecute()执行任何与UI相关的任务,您将获得ANR,因为此时没有UI。 例如,如果只是在onPostExecute()中打印一个Log.d()语句,该语句将在Logcat中可见。

**只有当进程处于活动状态且未被Android低内存杀手杀死时,这些才有可能实现。

查看图像以查看在哪个线程中执行哪些方法。

在此处输入图像描述

您可以轻松地测试它,只需将doInBackground()持续更长时间,例如添加Thread.sleep(5000)然后尝试各种方案:

  • 如果你完成了启动AsyncTask的Activity,或者离开它,AsyncTask正常完成,但是如果你持有对周围Activity的引用,你可能会导致内存泄漏或者在onPostExecute()崩溃你的应用程序(如UI元素),不再“活着”。
  • 如果您通过按“主页”按钮最小化您的应用程序,它将再次正常完成,但可能会崩溃onPostExecute()的应用程序
  • 如果您终止了应用程序进程(或系统执行了此操作),它将终止您的AsyncTask以及您希望它执行的作业doInBackground()将无法完成。 如果您只是使用new Thread(new Runnable() {...启动new Thread(new Runnable() {...