并行执行多个AsyncTask
我正在使用Android SDK 4.0.3 API15,我想并行运行多个AsyncTasks。 我从Web服务器获取数据并实时animation(10 fps)。 但根据用户的操作,我也需要发送一些数据到Web服务器。 发生这种情况时,我的animation会暂停一段时间(发送数据进入队列并等待数据完成),因此我无法实时捕捉。
这个答案是相当的解释,但我不能使它的工作。 所以任何帮助将非常感激。
我想我需要使用这个function来实现:
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 });
这是我如何做到这一点:
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 );
这个问题出现在我身上,在AndroidStudio中将我的应用程序更新为使用Android 2.3的Intelliy sdk 25只需稍作更改(executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,string1,…);)完美地工作。 我有一个AsyncTask运行在一个服务下载和创buildAsyncTasks上传没有服务。