我已经实现了2个asyn任务,我使用的是android4.0。其中一个asyntask连续执行,第二个根据需求执行(可能是多个时间)。 例如。
class AsynTask1 exetends AsyncTask<Void, Bitmap, Void>{
protected Void doInBackground(Void... params) {
while(true){
publishProgress(bmp);
}
}
}
class AsynTask2 extends AsyncTask<String, Void,Void>{
protected Void doInBackground(String... params){
System.out.println(params[0])
}
}
在活动课
class MainActivity extends Activity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new AsynTask1().execute();
int i=0;
while(i<100)
{
if(i%2==0)
new AsynTask2().execute("no is even"+i);
i++
}
}
}
在上述情况下,不执行AsynTask2。
如果尝试使用executeOnExecutor(AsyncTask.THREAD_POOL_Executor,params),那么两个asyntask都会被执行并且我从AsynTask2获取打印消息,但这些消息没有按顺序排列(如0 2 6 4 10 8 12 14 ... )。
是否有任何方法可以连续执行AsynTask1和顺序执行AsynTask2,以防止顺序(如0 2 4 6 8 10 12 14 ....)。
谢谢&amp;问候 迷你。
答案 0 :(得分:5)
将SERIAL_EXECUTOR用于Asynctask2
new AsynTask2().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR ,"no is even"+i)
编辑: 用于Asynctask1,因此不使用相同的执行程序
new AsynTask1().executeOnExecutor(AsyncTask.THREAD_POOL_Executor,params);
答案 1 :(得分:0)
尝试使用回叫。在AsyncTask类中定义接口并在主类中实现它们。使用AsyncTask2的onPostExecute上的callBack启动下一个AsyncTask2。你保证订单。
class AsyncTask2 extends AsyncTask<String, Void,Boolean<{
//Your code. doInBackground must now return a boolean.
protected Void onPostExecute(final Boolean success){
myCallback listener = (myCallback) parentActivity;
listener.call();
}
public Interface myCallback{
void call();
}
}
然后在您的主要活动中实施myCallback。
[编辑]
以下是您可以做的样本。
Class MainActivity extends Activity implements myCallback{
//Your code
public void call(){
new AsyncTask2().execute("no is even" + i);
}
}
答案 2 :(得分:0)
您不应该将AsyncTask用于长时间运行的线程(实现AsyncTask1的方式)。请参阅文档:http://developer.android.com/reference/android/os/AsyncTask.html。只需为AsyncTask1正在创建一个单独的线程。
由于您需要通过创建大小为1的ThreadPool来完成AsyncTask2中正在执行的操作的串行执行。
// Creating ThreadPool
ExecutorService service = Executors.newFixedThreadPool(1);
// Submitting task
service.execute(task);
// Shutting down the thread pool when not required.
service.shutdown();
答案 3 :(得分:-2)
int i=0;
while(i<100)
{
new AsynTask1().execute();
if(i%2==0)
{
new AsynTask2().execute("no is even"+i);
}
i++
}