从另一个AsyncTask调用AsyncTask

时间:2011-04-25 15:19:56

标签: android multithreading

在我的AsyncTask的某个点上,经过一些验证后,我需要产生另一个线程来做其他工作。所以我现在想要两个后台线程,每个都做自己的事情(每个执行大约2-3秒)。我们的想法是在Atrix等双核处理器上实现最佳性能。

是否可以创建另一个asynctask&从第一个执行它?谁能建议一个更好的方法呢?

谢谢!

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

4 个答案:

答案 0 :(得分:57)

  

创建另一个是否可以接受   asynctask&从第一个执行它   一个?

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

  

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

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

答案 1 :(得分:10)

如果您正在寻找执行多个异步任务的机制,从3.0及更高版本它支持一个名为executeOnExecutor的方法,它允许您在由Async Task管理的线程池上并行调度任务。 / p>

答案 2 :(得分:2)

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

此外,必须从主线程执行AsyncTask。来自AsyncTask参考:

  

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

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

您可以查看此article,看看哪种方式最适合您。

答案 3 :(得分:0)

这可以使用消息传递并发和单个处理程序来完成。概念证明代码如下:

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;
        }
    }
};

我按下按钮启动了第一个线程,如下所示:

 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();
            }
});

对线程休眠的调用是模仿时间密集型任务。