我最近参与了一些特别是Java和Android的并发编程。
我对处理程序有一些疑问。 1 - 众所周知,我们需要将一个Handler与一个线程相关联,它将在调用它的线程上运行。但是,在SO的一些示例中,用户正在进行
public class MainActivity extends Activity
{
private Handler handler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState)
{
handler.postDelayed(runnable, 1000);
}
private Runnable runnable = new Runnable()
{
public void run()
{
//Do whatever
handler.postDelayed(this, 30000);
}
};
在这个例子中,我假设我们在UI Thread上做了Handler事情,RIGHT?
我可以在这里代替//DO Whatever
进行网络操作吗?我不这么认为,因为我们是主线。
这样做毫无意义吗?可以使用AsyncTask来替换此任务吗?
如何应用相同的示例,但不能应用于UI线程,而不是单独的线程?
线程或Runnables有类似于延迟发布的内容吗?
将处理程序仅用于其后延迟功能是否常见,而不是主要的任务处理程序,即作为线程和UI / Activity之间的中间人?
答案 0 :(得分:0)
处理程序仅在您需要更新UI时才有用。您可能知道我们无法从非UI线程更新UI。如果你要在后台线程中做一些网络工作,然后更新UI,你必须使用Handler类或AsyncTask,或者你可以这样做:
(来自非UI线程)
SomeView.post(new Runnable() {
//updating UI
});
答案 1 :(得分:0)
如果你正在做的事情是"沉重的"你应该在一个线程中做到这一点。如果你没有在它自己的线程中显式启动它,那么它将在主(UI)线程上运行,这可能会引起用户的紧张或缓慢响应界面。
有趣的是,当您使用线程时,使用Handler作为您正在启动的工作线程与主线程之间的通信方式通常很有用。
典型的线程/处理程序交互可能如下所示:
Handler h = new Handler(){
@Override
public void handleMessage(Message msg){
if(msg.what == 0){
updateUI();
}else{
showErrorDialog();
}
}};
Thread t = new Thread() {
@Override
public void run(){
doSomeWork();
if(succeed){
//we can't update the UI from here so we'll signal our handler and it will do it for us.
h.sendEmptyMessage(0);
}else{
h.sendEmptyMessage(1);
}
} };
总的来说,带回家是你应该在任何时候使用线程,这可能是长时间运行或非常密集(即任何网络,文件IO,重型算术等)。