Dan*_*iel 15 android android-handler android-handlerthread
在android中,Handler可用于发布/处理消息,如果我不使用HandlerThread(将其Looper传递给Handler),这是否意味着在这种情况下Handler使用MainThread(UI Thread)的Looper?
如果Handler使用MainThread的Looper会得到什么结果?可能导致mainThread被阻止?
ozn*_*nus 16
如果要一次执行一个后台任务,并且希望这些任务按执行顺序运行,则可以使用HandlerThread.
例如,如果您想逐个进行多个网络后台操作.
是的,HandlerThread有它自己的looper并且可以创建并发布处理程序(因此它不会阻止主线程).
如果我不使用 HandlerThread(将它的 Looper 传递给 Handler),这是否意味着在这种情况下 Handler 使用 MainThread (UI Thread) 的 Looper ?
查看Handler 的文档
Handler ()
Run Code Online (Sandbox Code Playgroud)
默认构造函数将此处理程序与当前线程的 Looper 相关联。
如果您当前的线程是 MainThread,则它使用 MainThread(UI Thread) Looper。
要将处理程序显式关联到您的主线程(UI 线程),请编写以下代码。
Handler mHandler = new Handler(Looper.getMainLooper();
Run Code Online (Sandbox Code Playgroud)
如果你写如下,它使用HandlerThread Looper。
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());
Run Code Online (Sandbox Code Playgroud)
如果Runnable任务中有任何网络IO操作,则不能使用主线程looper。在这种情况下,HandlerThread发布Runnable执行网络 IO 操作的任务很方便。
您可以找到示例代码@How do I fix android.os.NetworkOnMainThreadException?
如果 Handler 使用 MainThread 的 Looper 会得到什么结果?可能会导致 mainThread 阻塞?
如果您向 MainThread Looper 发送许多事件,它们将在 MainThread(UI 线程)本身上执行。如果提交的任务需要更多时间执行,MainThread 将被阻塞。
查看下面的帖子以了解Looper 的内部结构:
像这样使用HandlerThread的正常方法:
HandlerThread thread = new HandlerThread("A Handler Thread");
thread.start();
Handler handler = new Handler(thread.getLooper()){
@Override
public void handleMessage(Message msg)
{
//....
}
};
Run Code Online (Sandbox Code Playgroud)
因为HandlerThread可以为Handler创建一个Looper,所以它是一种方便的方式.
当你创建一个新的Handler时,它被绑定到创建它的线程的线程/消息队列 - 请参阅官方文档...
| 归档时间: |
|
| 查看次数: |
12613 次 |
| 最近记录: |