0

我最近参与了一些特别是 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 线程上做 Handler 的事情,对吗?

我可以在这里进行网络操作//DO Whatever吗?我不这么认为,因为我们在主线程上。

这样做没有意义吗?因为有人可以使用 AsyncTask 来替换这个任务?

我怎样才能应用这个相同的例子,但不是在 UI 线程上,而是在一个单独的线程上?

线程或 Runnables 是否有类似于 post delay 的东西?

仅将处理程序用于其后延迟功能而不是主要任务处理程序是为常见的,即作为线程和 UI/Activity 之间的中间人?

4

2 回答 2

0

处理程序仅在您想要更新 UI 时才有用。您可能知道我们无法从非 UI 线程更新 UI。如果你打算在后台线程中做一些网络工作,然后更新 UI,你必须使用 Handler 类或 AsyncTask 或者你可以这样做:

(来自非 UI 线程)

SomeView.post(new Runnable() {
   //updating UI
});
于 2013-09-19T11:54:42.610 回答
0

如果您正在做的任何事情都是“沉重的”,那么您应该在线程中进行。如果您没有在自己的线程中明确启动它,那么它将在主 (UI) 线程上运行,这可能会导致用户界面抖动或响应缓慢。

有趣的是,当您使用线程时,通常还可以使用 Handler 作为您正在启动的工作线程和主线程之间的通信手段。

典型的 Thread/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、繁重的算术等)时,你应该使用线程。

于 2016-05-09T06:31:42.777 回答