-->

为什么在Android上使用HandlerThread(Why use HandlerThread

2019-06-24 17:05发布

在Android中,处理器可以用于发布/手柄的消息,如果我不使用HandlerThread(通过其活套到处理器),这是否意味着在这种情况下,处理器使用MainThread(UI线程)的活套?

会得到什么结果,如果处理程序使用MainThread的尺蠖? 可能导致mainThread受阻?

Answer 1:

你会在要执行后台任务一次一个情况下使用HandlerThread,你想,这些任务将在执行的顺序运行。

例如,如果你想几个网络后台操作一个接一个。

是的,HandlerThread都有自己的活套,并且可以创建处理程序,并张贴,(所以它不会阻塞主线程)。



Answer 2:

使用HandlerThread这样的正常方式:

HandlerThread thread = new HandlerThread("A Handler Thread");
thread.start();
Handler handler = new Handler(thread.getLooper()){
    @Override
    public void handleMessage(Message msg) 
    {
    //....
    }
};

由于HandlerThread可以创建一个处理程序活套,这是一种便捷的方式。

当你创建一个新的处理程序,它被绑定到创建它的线程的线程/消息队列 - 请参阅官方文档...



Answer 3:

由于文件说:

手持类开始,有一个弯一个新的线程。
然后,将弯针可以用来创建处理程序类。
需要注意的是启动()仍必须调用。

HanderThread类从Thread类,它封装的Looper对象,所以我们不在乎弯针开放和释放的细节继承。 就像在正常线的情况下,我们需要用Looper.prepare()Looper.loop()将其转换为LooperThread



Answer 4:

如果我不使用HandlerThread(通过其活套到处理器),这是否意味着在这种情况下,处理器使用MainThread(UI线程)的活套?

看一看的文档处理程序

Handler ()

默认的构造同伙这个处理器与乐句当前线程。

如果当前线程是MainThread,它采用MainThread(UI线程)活套。

为了处理程序到您的MainThread(UI线程)明确联系起来,下面写的代码。

Handler  mHandler = new Handler(Looper.getMainLooper();

如果你写的是如下,它采用HandlerThread活套。

HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());

如果您有任何网络IO操作Runnable任务,则不能使用主线程活套。 在这种情况下, HandlerThread是得心应手张贴Runnable任务执行网络IO操作。

你可以找到例子代码@ 我如何修复android.os.NetworkOnMainThreadException?

会得到什么结果,如果处理程序使用MainThread的尺蠖? 可能导致mainThread受阻?

如果你发送许多事件MainThread尺蠖,他们将执行在MainThread(UI线程)本身。 如果提交的任务花费更多的时间来执行,MainThread将被阻止。

检查后下进行的内部尺蠖 :

什么是活套,以及如何使用它的目的是什么?



Answer 5:

当您要执行大量的后台任务,因为它有自己的活套HandlerThread是非常有用的。 一般来说,如果你发布消息处理程序,它使用了MainThread的活套。 这意味着,该任务是在UI线程执行。 但在HandlerThread的情况下,这些任务的工作线程上执行。 你可以找到一个更详细的解释在这里



文章来源: Why use HandlerThread in Android