我正在研究需要多次执行asynctask的android应用程序 并且每一个都应该在前一个完成后执行
这是描述我的问题的简单片段
String text1="text1";
String text2="text2";
new asynctask().execute(text1);
new asynctask().execute(text2);
但是我面临的问题是两个asynctask并行运行,而不是前一个执行下一个asynctask。
答案 0 :(得分:0)
实现将跟踪实例状态的状态机。在onPostExecute()函数中,调用一个方法来检查实例的状态,并采取适当的行动(如果需要,再次调用AsyncTask等)
答案 1 :(得分:0)
由于您的目标是API 10,因此串行线程池不适用于您的AsyncTask,但您可以创建自己的。您可以将其扩展到您可能需要的任何AsyncTask功能......
首先,创建一个串行执行的线程池,a.k.a。,一个线程。
public enum SerialTaskExecutor {
INSTANCE;
public static SerialThreadPool getInstance() {
return INSTANCE;
}
private final ExecutorService mExecutor;
private final Handler mMainHandler;
private SerialThreadPool() {
mExecutor = Executors.newSingleThreadExecutor();
mMainHandler = new Handler(Looper.getMainLooper());
}
public void executeTask(final SerialTask<P, R> t, final P... params){
if(t == null){
return;
}
mExecutor.execute(new Runnable(){
@Override
public void run(){
final R result = t.doInBackground(params);
mMainHandler.post(new Runnable(){
@Override
public void run(){
t.onMainThread(result);
}
});
}
});
}
}
然后定义您的串行任务接口:
public interface SerialTask<P, R> {
public R doInBackground(P... params);
public void onMainThread(R result);
}
最后,不是实现AsyncTask,而是实现SerialTask:
public MyTextTask implements SerialTask<String, Void> {
@Override
public Void doInBackground(String... params) {
// do my string processing here
return null;
}
@Override
public void onMainThread(Void result)
// update ui here
}
}
现在您的简单代码段变为:
String text1="text1";
String text2="text2";
SerialTaskExecutor exe = SerialTaskExecutor.getInstance();
exe.executeTask(new MyTextTask(), text1);
exe.executeTask(new MyTextTask(), text2);
答案 2 :(得分:0)
您还可以使用以下代码行等待第一个AsyncTask完成:
String firstTask = new asynctask().execute(text1).get();
,然后强>
String secondTask = new asynctask().execute(text2).get();
它将等到你的第一次完成。但是你的UI会被阻止。