18

私はアプリケーションを持っており、私が使用しているメインスレッドでネットワーク操作を行うことができないAsyncTaskため、問題は一度私execute()がアクティビティを行い、AsyncTaskその直後にユーザーがアプリ全体を操作することです。不思議に思っているのは:finish()finish()

  1. アプリの実行中に呼び出された限り、アプリが閉じられていても、AsyncTask常に終了doInBackground()しますか?onPostExecute()execute()
4

5 に答える 5

15

これをテストできます。はい、そうです。execute が呼び出された場合、フォアグラウンドまたは UI 関連に何かを行わない限り、Asynctask が引き続き実行されることがわかります。(ランチャーがクラッシュする可能性があります)。


ただし、システムに近い場合。メソッドの実行を継続する場合と継続しない場合があります。私はすでにここでテストして回答しています。コメントへの返信: テスト済み:

@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 &#39;android&#39; 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">
//....
于 2013-04-25T01:06:31.137 に答える
9

onPostExecute()UI スレッドから呼び出されるため、UI スレッドが実行されていない場合、引き続き実行されることはありません。ただしdoInBackGround()、別のワーカー スレッドから実行されるため、完了するまで (または JVM プロセスが OS によって強制終了された場合も可能性があります) 継続します。AsyncTasks は、UI バウンドの短いバックグラウンド タスクにのみ推奨され、実行時間の長いバックグラウンド作業 (数秒) には推奨されないことに注意してください。

要するに、それが継続すると仮定することはできませんし、進行状況を投稿したり、onPostExecute().

于 2013-04-25T01:10:16.937 に答える
6

Activity で finish() を呼び出すと、Activity は破棄されますが、メイン スレッドは破棄されません。[注: アクティビティはメイン スレッドで実行されます。アクティビティはメイン スレッドではありません。]

したがって、バックグラウンド スレッドの doInBackground() とメイン スレッドの onPostExecute() が実行されます。ただし、onPostExecute() が UI 関連のタスクを実行すると、この時点では UI がないため、ANR が発生します。たとえば、onPostExecute() 内の Log.d() ステートメントを単に出力すると、そのステートメントは Logcat に表示されます。

** これらは、プロセスが生きている場合にのみ可能で、Android Low Memory Killer によって強制終了されません。

于 2014-12-04T07:41:38.297 に答える
1

どのスレッドでどのメソッドが実行されているかを確認するには、画像を参照してください。

ここに画像の説明を入力

于 2017-05-28T17:06:13.400 に答える