Android 执行多个异步任务';平行

Android 执行多个异步任务';平行,android,parallel-processing,android-asynctask,Android,Parallel Processing,Android Asynctask,我使用的是Android SDK 4.0.3 API15,我想并行运行多个异步任务。我从web服务器获取数据,并实时制作动画(每秒10帧)。但根据用户操作的不同,我还需要向web服务器发送一些数据。当这种情况发生时,我的动画会暂停一小段时间(发送数据进入队列,获取数据等待它完成),因此我无法捕捉实时图像 这是很好的解释,但我无法让它工作。因此,任何帮助都将不胜感激 我认为我需要使用此功能来实现: AsyncTask.executeOnExecutor(Executor exec, Params.

我使用的是Android SDK 4.0.3 API15,我想并行运行多个异步任务。我从web服务器获取数据,并实时制作动画(每秒10帧)。但根据用户操作的不同,我还需要向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();
    }
}
我就是这样做的:

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


在AndroidStudio中将我的应用程序更新为时,我出现了此问题 使用安卓2.3的Intelliy sdk 25 只是一点小小的改变(executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR,string1,…))就可以完美地工作。 我有一个AsyncTask在服务中运行,用于下载和下载
创建AsyncTasks以便在无服务中上载。

您所说的“不能将执行器作为参数传递,也不能实例化执行器”是什么意思?你检查过developer.android.com/reference/java/util/concurrent/Executor.html吗?你想用哪种遗嘱执行人?事实上我对遗嘱执行人没有太多经验。所以我尝试实例化Executor类。据我从链接中了解,我需要使用ThreadPoolExecutor。我会找的。谢谢。对,Executor只是一个接口,不能被实例化。您可以查看执行人文档中的“已知间接子类”部分,查看提交的执行人。然而,典型的是ThreadPoolExecutor。还有一个问题。我的异步任务应该在不同的类中并行运行。我应该使用相同的ThreadPoolExecutor实例使它们并行运行吗?或者任何从该类创建的实例并行工作?您需要相同的执行器实例来利用它。实际上,executor就像您可以设置的任务(线程或异步任务)的“管理器”(例如,同时任务的数量等)。因此,it的单个实例应该了解所有任务,以便能够管理它们。我如何将我的论点传递给它。这样地?新的MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,新字符串[]{requestString});请始终从SDK文档开始。虽然不是完美的,但它是有用的。。关于
executeOnExecutor()
:这样你就可以传递你的参数了。在问这个问题之前,我已经看过了,但我不知道如何使用它。我试图将
executeOnExecutor(Executor-exec,Params…Params)
添加到我的类定义中,但据您所知,它不起作用。我是个新手,但我试着自己完成事情。在这种情况下,我根本不知道(也找不到)如何正确使用它:
newmyasynctask().executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR)非常感谢您提供的这些信息,这些信息起到了奇迹般的作用。请不要灰心:)不需要对AsyncTask子类进行任何更改。如果您已经让它工作了,只需将
myTask.execute()
替换为
myTask.executeonexecuter(AsyncTask.THREAD\u POOL\u executer)。如果您将参数传递给您的任务(即
myTask.execute(string1,string2)
您可以在这里执行相同的操作
myTask.executeonexecuter(AsyncTask.THREAD\u POOL\u executer,string1,string2);
。除了执行任务的方式之外,没有任何变化。我们可以在一个活动中并行执行两个单独的异步类吗。
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 );