从另一个AsyncTask调用一个AsyncTask

在AsyncTask的某个时候,在做了一些validation之后,我需要从另一个线程中产生一些其他的工作。 所以我想在这一点上有两个后台线程,每个都是自己的东西(每个执行大约2-3秒)。 这个想法是最大限度地提高像Atrix这样的双核处理器的性能。

创build另一个asynctask并从第一个执行它是可以接受的吗? 任何人都可以提出一个更好的方式做到这一点

谢谢!

编辑:我想知道什么publishProgress()从第二个任务甚至会做…因为它不是从一个活动开始?

Solutions Collecting From Web of "从另一个AsyncTask调用一个AsyncTask"

创build另一个asynctask并从第一个执行它是可以接受的吗?

是的,但只在onProgressUpdate()onPostExecute()因为这些方法在UI线程上运行。 因此,通过select上面列出的两种方法之一,在UI线程上启动第二个AsyncTask

我想知道从第二个任务publishProgress()甚至会做…因为它不是从一个活动开始?

它完全一样,因为你是从UI线程开始的。

如果您正在寻找一个执行多个asynchronous任务的机制,从3.0开始,它支持一个名为executeOnExecutor的方法,这个方法允许您在由asynchronous任务pipe理的线程池上并行调度任务。

AsyncTask在与主线程通信以处理UI更改时进行一些后台工作很有用。 看来,这不是你的情况。

另外,一个AsyncTask必须从主线程执行。 从AsyncTask参考:

有一些线程规则必须遵循这个类才能正常工作:

  • 任务实例必须在UI线程上创build。
  • 必须在UI线程上调用execute(Params …)。

你可以看看这篇文章 ,看看最适合你的是什么。

这可以通过消息传递并发和单个处理程序完成。 概念validation码如下:

 private Handler myHandler= new Handler(){ @Override public void handleMessage(Message msg){ switch(msg.what){ case 0: Toast.makeText(Main.this,"Message0", Toast.LENGTH_SHORT).show(); Thread thread= new Thread( new Runnable() { public void run() { try { Thread.sleep(3000); } catch(Exception e){} myHandler.sendEmptyMessage(2); } }); thread.setDaemon(true); // <== I am a service provider. KILL ME if the non-daemon thread ConfuseText quits thread.start(); break; case 1: Toast.makeText(Main.this,"Message1", Toast.LENGTH_SHORT).show(); break; case 2: Toast.makeText(Main.this,"Message2", Toast.LENGTH_SHORT).show(); break; default: super.handleMessage(msg); break; } } }; 

我点击button启动第一个线程,如下所示:

  ON CLICK HANDLER threadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Thread thread= new Thread( new Runnable() { public void run() { try { Thread.sleep(1000); } catch(Exception e){ } myHandler.sendEmptyMessage(0); try { Thread.sleep(3000); } catch(Exception e){ } myHandler.sendEmptyMessage(1); } }); thread.setDaemon(true); // <== I am a service provider. KILL ME if the non-daemon thread ConfuseText quits thread.start(); } }); 

线程hibernate的调用是模仿一个时间密集型的任务。