31

私は Android SDK 4.0.3 API15 を使用しており、複数の AsyncTasks を並行して実行したいと考えています。Web サーバーからデータを取得し、リアルタイムでアニメーション化 (10 fps) しています。しかし、ユーザーの操作によっては、Web サーバーにもデータを送信する必要があります。これが発生すると、アニメーションが短時間一時停止します (データの送信がキューに入れられ、データの取得が終了するのを待ちます)。したがって、リアルタイムをキャッチできません。

この答えはかなり説明していますが、うまくいきませんでした。そのため、どんな助けでも大歓迎です。

それを達成するには、この関数を使用する必要があると思います:

AsyncTask.executeOnExecutor(Executor exec, Params... params)

しかし、エグゼキューターをパラメーターとして渡すことはできず、エグゼキューターをインスタンス化することもできません。これは私の AsyncTask クラスです:

public class GetPlayers extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {

        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

        rawData="";
        for (String url : urls) {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            try {
                HttpResponse execute = client.execute(httpGet);
                InputStream content = execute.getEntity().getContent();

                BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
                if((rawData = buffer.readLine()) == null){
                    rawData = "error";
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return rawData; 
    }

    @Override
    protected void onPostExecute(String result) {
        manipulate();
    }
}

そして、私はそれを次のように実行します:

GetPlayers task = new GetPlayers();
requestString = "web adress is here...";
task.execute(new String[] { requestString });
4

2 に答える 2

58

これは私がそれを行う方法です:

if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
    new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    new MyAsyncTask().execute();
}

MyAsyncTask通常の AsyncTask サブクラスです。または、これをすべてヘルパー クラスでラップすることもできます。

class TaskHelper {

    public static <P, T extends AsyncTask<P, ?, ?>> void execute(T task) {
        execute(task, (P[]) null);
    }

    @SuppressLint("NewApi")
    public static <P, T extends AsyncTask<P, ?, ?>> void execute(T task, P... params) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
        } else {
            task.execute(params);
        }
    }
}

そして、次のようにします:

TaskHelper.execute( new MyTask() );

また

TaskHelper.execute( new MyTask(), args );

また

TaskHelper.execute( new MyTask(constructorParams), args );
于 2012-08-28T13:19:29.607 に答える