小编Nat*_*ate的帖子

多次调用Looper会导致"在死线程上向处理程序发送消息"

我正在使用Executor [固定线程池]和我自己的ThreadFactory添加一个Looper:

Handler HANDLER = new Handler();
Executor    THREADS = Executors.newFixedThreadPool(THREAD_POOL_SIZE, new ThreadFactory() {
    @Override public Thread newThread(Runnable runnable) {
        return new MyThread(new Runnable() {
            @Override public void run() {
                Looper.prepare();
                runnable.run();
            }
        });
    }
});

private static class MyHandler extends Handler {
    public boolean fail;
        public void handleMessage(Message msg) {
        switch(msg.what) {
            case 1:
                this.fail = msg.arg1 == 1;
                Looper.myLooper().quit();
                break;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在运行一个发出网络请求的线程,但如果网络出现故障,我希望向用户显示一条对话框消息.这个过程非常复杂,因为它需要在UI线程中进行AND显示请求.我可以通过简单地向网络线程添加一个循环并等待从UI线程发送消息来等待用户对该对话框的响应.这允许我在一段时间(tryAgain)线程中封装网络请求.一切正常,除非第二次调用Looper.loop()方法(显示第二个网络错误对话框后),并且对话框(在UI线程中)将消息发送到网络线程的处理程序:

THREADS.execute(new Runnable() {
    private MyHandler   myHandler   = new MyHandler();
    @Override public void run() …
Run Code Online (Sandbox Code Playgroud)

android handler executor looper

1
推荐指数
1
解决办法
6142
查看次数

标签 统计

android ×1

executor ×1

handler ×1

looper ×1