【问题标题】:Android Java object with own thread using looper使用looper拥有自己线程的Android Java对象
【发布时间】:2015-07-17 13:49:29
【问题描述】:

我试图在 Android 中实现可以在自己的线程中工作的对象(我不想公开处理程序,我想用自己的公共 api 包装 sendMessage 方法)。它具有将数据传递给对象的公共方法。该对象与活动生命周期(onResume、onPause)相关联。我想使用循环器和处理程序,而不仅仅是带有无限循环的纯 Java 线程。我想在恢复时启动工作线程并停止处理暂停回调。对象必须无限等待新消息。 这是我下面的代码:

public class ThreadingObject {

    private MyThread thread;

    public ThreadingObject() {}

    public void onResume() {
        thread = new MyThread();
        thread.startWorking();
    }

    public void onPause() {
        thread.stopWorking();
    }

    public void setMessage(Object object) {
        Message msg = new Message();
        msg.obj = object;
        thread.handler.sendMessage(msg);
    }

    protected void work(Object object) {
        //Do something with object in own thread
    }

    private class MyThread extends Thread {
        public Handler handler;

        @Override
        public void run() {
            Looper.prepare();
            handler = new Handler() {

                @Override
                public void handleMessage(Message msg) {
                    ThreadingObject.this.work((String[]) msg.obj);
                }
            };
            Looper.loop();
        }

        public void startWorking() {
            start();
        }

        public void stopWorking() {
            handler.getLooper().quit();
        }
    }
}

它是正确的实现吗?我收到警告:“向死线程上的处理程序发送消息”。有什么我看不到的问题吗?

【问题讨论】:

  • 你想写你自己的HandlerThread 吗?
  • 我已经阅读了有关 HandlerThread 的信息,我认为其中一个不同之处在于 HandlerThread 为我准备了 Looper 和 Handler。您有任何示例如何以安全的方式启动和停止线程(当然不是 thread.join())?

标签: java android multithreading android-handler android-looper


【解决方案1】:

这是我的实现:

public class ThreadingObject {

    private HandlerThread thread;
    private Handler handler;

    private Handler.Callback handlerCallback = new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            work(msg.obj);
            return true;
        }
    };

    public ThreadingObject() {}

    public void onResume() {
        thread = new HandlerThread("SurfaceView HandlerThread");
        thread.start();
        handler = new Handler(thread.getLooper(), handlerCallback);
    }

    public void onPause() {
        if(thread != null) {
            thread.quit();
            thread = null;
        }
        handler = null;
    }

    public void setMessage(Object object) {
        Message msg = new Message();
        msg.obj = object;
        handler.sendMessage(msg);
    }

    protected void work(Object obj) {
        //Working
    }
}

【讨论】:

    【解决方案2】:

    在那个run()方法中,如果需要重新运行或者使用循环,需要自己添加,例如。

    而你的错误,是因为你试图调用已经完成的线程。

        boolean aLoopLoopLoop = true;
        Handler handler;
    
        // this handler, you no need to declare it repeatedly, just declare it in onCreate() is enough
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                ThreadingObject.this.work((String[]) msg.obj);
            }
        };
    
        // -----
        @Override
        public void run() {
            Looper.prepare();
            final Looper looper = Looper.myLooper();
            while(aLoopLoopLoop) {
                // write your code here
                Looper.loop();
            }
            // after loop exit, quit loop
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    looper.quit(); 
                }
            }, 3000);
        }
    
        // -----
        public void stopWorking() {
            aLoopLoopLoop = false;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-19
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      相关资源
      最近更新 更多