Android:什么时候应该使用 Handler(),什么时候应该使用 Thread?

标签 android multithreading android-handler

当我需要异步运行某些东西时,例如长时间运行的任务或使用网络的逻辑,或出于任何原因, 启动 新线程 并运行它可以正常工作。 创建 Handler 并运行它也可以。 有什么不同?我应该什么时候使用每一个? 使用 Handler 而不是 Thread 的优点/原因是什么?

PS。 - 为了这个问题,让我们忽略AsyncTask。 - Handler().postDelayed 用例对我来说很清楚,为了这个问题,让我们假设我需要立即开始任务。

最佳答案

如果你正在做的任何事情都是“重”的,那么你应该在一个线程中做它。如果您没有在自己的线程中明确启动它,那么它将在主 (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、繁重的算术等)时使用线程。

关于Android:什么时候应该使用 Handler(),什么时候应该使用 Thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13954611/

相关文章:

android - 在 HTC Desire S 上,软键盘不会在 EditText 焦点上弹出

java - Android 数据库中的 ClassCastException

java - 以原子方式更新两个 ConcurrentHashMap

Android,如何增加列表适配器中的行高?

android - 在android中将图像和视频发送到服务器

java - jvm如何处理多个处于可运行状态的线程

c++ - 每次调用工作负载非常低的连续并行计算

java - 运行类时应用程序进入MainActivity

android - Android 服务中的处理程序 postDelayed

java - 从处理程序调用时,asynctask 未获取 arraylist