2

2 つの非同期タスクを開始したいのですが、実行されるのは 1 つだけです。LogCat の出力は次のようになります。

firstAsync started
secondAsync started
secondAsync ends
firstAsync ends
end

しかし、LogCat の出力は

firstAsync started
end

これは、secondAsync が実行されたことがないことを示しています。Javaコードは次のとおりです。

package com.example.async;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.app.Activity;

public class MainActivity extends Activity {

    public boolean stopAsync=false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new firstAsync().execute();
        new secondAsync().execute();
        Log.e("end","end");
    }

    class firstAsync extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            Log.e("firstAsync started","firstAsync started");
            while(!stopAsync)
            {

            }
            Log.e("firstAsync ends","firstAsync ends");
            return null;
        }
    }

    class secondAsync extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            Log.e("secondAsync started","secondAsync started");
            stopAsync = true;
            Log.e("secondAsync ends","secondAsync ends");
            return null;
        }
    }

}

それで、問題は、どうすれば複数の非同期タスクを開始できるかということです。助けていただければ幸いです。よろしくクリス

4

3 に答える 3

4

AsyncTasks は、次を使用しない限り、常に一度に 1 つずつ実行されますexecuteOnExecutor()

AsyncTask はヘルパー クラスとして設計されておりThreadHandler一般的なスレッド フレームワークを構成するものではありません。

からはHONEYCOMB、並列実行によって発生する一般的なアプリケーション エラーを回避するために、タスクは単一のスレッドで実行されます。本当に並列実行が必要な場合は、で呼び出すことができ executeOnExecutor(java.util.concurrent.Executor, Object[])ます THREAD_POOL_EXECUTOR

于 2012-12-29T21:25:07.453 に答える
1

これは面白い

これで、最初の非同期の中に 2 番目の非同期を配置して、事前実行を開始します。logcat とコードはそれを最もよく示しています。

私の丸太猫:

12-29 21:53:35.661: E/Async1: being executed
12-29 21:53:35.661: E/Async1: executing
12-29 21:53:35.661: E/Async2: being started
12-29 21:53:35.669: E/Async2: backgrounding
12-29 21:53:35.669: E/Async1: backgrounding
12-29 21:53:35.676: E/Async2: finishing
12-29 21:53:35.676: E/Async1: finishing

次のコードの場合:

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.e("Async1", "being executed");
    new Async1().execute();
}

public class Async1 extends AsyncTask {

    @Override
    protected void onPreExecute() {
        Log.e("Async1", "executing");
        Log.e("Async2", "being started");
        new Async2().execute();
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Object result) {
        // TODO Auto-generated method stub
        Log.e("Async1", "finishing");
        super.onPostExecute(result);
    }

    @Override
    protected Object doInBackground(Object... arg0) {
        Log.e("Async1", "backgrounding");
        return null;
    }

    public class Async2 extends AsyncTask {

        @Override
        protected void onPostExecute(Object result) {
            Log.e("Async2", "finishing");
            super.onPostExecute(result);
        }

        @Override
        protected Object doInBackground(Object... params) {
            Log.e("Async2", "backgrounding");
            return null;
        }
    }
}
于 2012-12-29T22:01:05.873 に答える
0

最初の AsyncTask の onPostExecute() メソッドで、2 番目の AsyncTask を開始します。

protected void onPostExecute(String result) {
    if (result!=null)
    //start the Second asyncTask
    new secondAsync().execute();
}
于 2012-12-29T21:17:26.747 に答える