使用处理程序

时间:2013-09-19 10:11:10

标签: android multithreading concurrency runnable android-handler

我最近参与了一些特别是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之间的中间人?

2 个答案:

答案 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,重型算术等)。