Srh*_*rht 29 parallel-processing android android-asynctask
我正在使用Android SDK 4.0.3 API15,我希望并行运行多个AsyncTasks.我从Web服务器获取数据并实时动画(10 fps).但是根据用户操作,我还需要将一些数据发送到Web服务器.当发生这种情况时,我的动画暂停一小段时间(发送数据进入队列并获取数据等待它完成)因此我无法捕捉实时.
这个答案很有说服力,但我无法使其发挥作用.所以任何帮助都将非常感激.
我想我需要使用这个功能来实现:
AsyncTask.executeOnExecutor(Executor exec, Params... params)
Run Code Online (Sandbox Code Playgroud)
但我无法将执行程序作为参数传递,我无法实例化执行程序.这是我的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();
}
}
Run Code Online (Sandbox Code Playgroud)
我执行它是这样的:
GetPlayers task = new GetPlayers();
requestString = "web adress is here...";
task.execute(new String[] { requestString });
Run Code Online (Sandbox Code Playgroud)
Mar*_*ski 57
这就是我这样做的方式:
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
new MyAsyncTask().execute();
}
Run Code Online (Sandbox Code Playgroud)
其中MyAsyncTask是常规的AsyncTask子类.或者你可以将这一切包装在helper类中:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后就是:
TaskHelper.execute( new MyTask() );
Run Code Online (Sandbox Code Playgroud)
要么
TaskHelper.execute( new MyTask(), args );
Run Code Online (Sandbox Code Playgroud)
要么
TaskHelper.execute( new MyTask(constructorParams), args );
Run Code Online (Sandbox Code Playgroud)