在我的AsyncTask的某个点上,在完成了一些验证之后,我需要从另一个线程产生一些其他工作。所以我现在需要两个后台线程,每个线程都是自己的(每个执行大约2-3秒)。这个想法是为了最大限度地提高Atrix等双核处理器的性能。从另一个AsyncTask调用一个AsyncTask
是否可以创建另一个asynctask &从第一个执行它?任何人都可以提出一个更好的方式来做到这一点
谢谢!
编辑:我想知道什么publishProgress()从第二个任务甚至会做...因为它不是从一个活动开始?
在我的AsyncTask的某个点上,在完成了一些验证之后,我需要从另一个线程产生一些其他工作。所以我现在需要两个后台线程,每个线程都是自己的(每个执行大约2-3秒)。这个想法是为了最大限度地提高Atrix等双核处理器的性能。从另一个AsyncTask调用一个AsyncTask
是否可以创建另一个asynctask &从第一个执行它?任何人都可以提出一个更好的方式来做到这一点
谢谢!
编辑:我想知道什么publishProgress()从第二个任务甚至会做...因为它不是从一个活动开始?
是否可以接受创建另一个 的AsyncTask &从第一 一个执行呢?
是的,但只在onProgressUpdate()
或onPostExecute()
之内,因为这些方法在UI线程上运行。因此,通过选择上面列出的两种方法之一,在UI线程上启动第二个AsyncTask
。
我想知道什么publishProgress() 从第二个任务,甚至会做...... 因为它不是从 活动开始了吗?
它完全一样的东西,因为你是从UI线程开始的。
AsyncTask对于在与主线程通信以处理UI更改时执行一些后台工作很有用。看来,这不是你的情况。
此外,一个AsyncTask必须从主线程执行。从参考的AsyncTask:
有一些线程规则 必须遵循这一类 正常工作:
- 任务实例必须在UI线程上创建。
- execute(Params ...)必须在UI线程上调用。
您可以将看看这个article,看看哪种最适合您。
如果您正在寻找执行多个异步任务的机制,从3.0及以上版本开始,它支持一种名为executeOnExecutor的方法,该方法允许您在由异步任务管理的线程池上并行调度任务。
+1信息。我正在开发的这个特定应用程序的目标是2.2和更高版本,所以不能在这里使用,但很有必要知道未来。 – OceanBlue 2011-04-25 17:43:33
这可以使用消息传递并发和单个处理程序完成。的概念证明代码如下:
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();
}
});
线程睡眠的调用是模仿一个时间密集型任务。
我想知道这是否比AsyncTask有什么优势,以及在哪种情况下选择另一种? – 2012-11-30 17:31:42
Lanner:谢谢。这完美地解决了我的问题。 – OceanBlue 2011-04-25 17:48:23
'onPreExecute()'也在UI线程上运行呢? http://developer.android.com/reference/android/os/AsyncTask.html#onPreExecute%28%29 – 2014-12-21 19:36:47
@ ban-geoengineering onPreExecute()方法,顾名思义,将在所有其他方法之前执行但是,AsyncTask不管它是否也在UI线程中执行。基本上,如果您需要在doInBackground(...)开始之前每次执行一些计算或逻辑,则这是您的方法。 – tsukanomon 2015-06-02 13:11:20