【问题标题】:Difference between Handler and Threads in Android and Do Handlers create separate threads?Android中处理程序和线程之间的区别以及处理程序是否创建单独的线程?
【发布时间】:2016-04-10 20:18:34
【问题描述】:

我已经阅读了很多关于这个主题的问题,但我找不到任何可以回答我非常简单的问题的直接答案:处理程序实际上是创建新线程还是只是为创建它们的同一线程创建一个处理程序从?在 Android 文档中,他们提到:

“每个 Handler 实例都与单个线程和该线程的消息队列相关联。当您创建一个新的 Handler 时,它会绑定到正在创建它的线程的线程/消息队列——从那时起,它会将消息和可运行对象传递到该消息队列,并在它们从消息队列中出来时执行它们。”

然后他们也在同一页面上提到:

“处理程序有两个主要用途:(1) 安排消息和可运行对象在未来某个时间点执行;(2) 将要在与您自己的线程不同的线程上执行的操作排入队列。 ”。

我不确定它们是否意味着 Handler 实际上创建了新线程,这些线程可以与创建它们的线程(例如,从 UI 线程)进行通信,或者如果创建了 Handler,它们允许不同的线程与 UI 线程通信来自 UI 线程?

例如,在我的 MainActivity 和 onCreate() 函数中,我这样做:

public class MainActivity extends ActionBarActivity {

    private static final String TAG = "MyApp: " + MainActivity.class.getSimpleName();
    private Handler mHandler;
    private Runnable mRunnable = new Runnable() {
        public void run() {
            // do something
            processData();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate");

        mHandler = new Handler();
        mHandler.post(mRunnable);

        .....

我是否真的在这里创建了一个独立于 UI 线程的新线程,它将执行函数 (processData)?如果我没有创建一个新线程,那么我上面的代码和只调用函数(processData)而不需要创建一个处理程序有什么区别,如下所示:

public class MainActivity extends ActionBarActivity {

    private static final String TAG = "MyApp: " + MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate");
        processData();

        .....

非常感谢。

安马尔

【问题讨论】:

    标签: java android


    【解决方案1】:

    问题的答案

    “我是否真的在这里创建了一个新线程,独立于 UI 线程,将执行函数(processData)?如果我不创作 一个新线程,那么我上面的代码有什么区别 并且只需调用函数(processData)而不需要创建一个 处理程序?”

    不是,发布runnable并不意味着创建线程并在后台运行runnable。

    发布runnable和调用函数的区别:理论上,发布runnable会在消息队列准备好时将其添加到消息队列中进行处理,同时调用函数会立即执行,但总的来说两者都是类似。

    顾名思义,消息队列以 FIFO(先进先出)的方式处理处理程序发布的可运行文件。

    处理程序可以与线程一起使用,将后台线程的更新发布到 UI 线程。

    这是我写的关于使用处理程序的旧帖子: http://android-pro.blogspot.com.eg/2011/05/threading-in-android-part-1-handlers.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2012-05-04
      • 2011-06-26
      • 1970-01-01
      相关资源
      最近更新 更多