并行执行多个AsyncTask

时间:2012-08-28 12:38:56

标签: android parallel-processing android-asynctask

我正在使用Android SDK 4.0.3 API15,我希望并行运行多个AsyncTasks。我从Web服务器获取数据并实时动画(10 fps)。但是根据用户操作,我还需要将一些数据发送到Web服务器。当发生这种情况时,我的动画会暂停一段时间(发送数据进入队列并获取数据等待它完成),因此我无法捕捉实时。

这个answer很有说服力,但我无法让它发挥作用。所以任何帮助都将非常感激。

我想我需要使用这个功能来实现这个目标:

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 });

2 个答案:

答案 0 :(得分:56)

我就是这样做的:

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 );

答案 1 :(得分:0)

当我在AndroidStudio中更新我的应用时出现此问题 来自Intelliy的sdk 25使用Android 2.3 只是一点点改变(executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,string1,...);)完美无缺。 我在服务中运行AsyncTask进行下载和 在没有服务的情况下创建AsyncTasks以便上传。