如何编写简单的自定义Android Handler类?

时间:2012-04-13 18:08:44

标签: java android

对我来说有趣的是如何使用纯java来编写简单的Android Handler类来将信号从一个线程发送到另一个线程?

我看到了源代码: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/os/Handler.java

但是,例如如何编写可以从一个线程向另一个线程发送例如int值的类(Handler类)(不使用共享数据(如在Android Handler中?))?

2 个答案:

答案 0 :(得分:6)

如果你的线程与接收消息的处理程序的方法相同,你可以这样做:

final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
             // do something
    }
}

final Thread th = new Thread() {
    public void run() {
            // do something than send an integer - x in our case
            int x = 0;         
            final Message msg = Message.obtain(handler, x, null);
            handler.dispatchMessage(msg);
        }
    };
th.start();

如果无法直接从线程访问您的处理程序,那么创建一个扩展Thread的类并将处理程序传递给类的构造函数。

答案 1 :(得分:0)

这是仅使用Java Api即可创建自己的CustomHandler(如android处理程序)的方法。

private class CustomHandler {

private final Runnable POISON = new Runnable() {
    @Override
    public void run() {}
};

private final BlockingQueue<Runnable> mQueue = new LinkedBlockingQueue<>();

public CustomHandler() {
    initWorkerThread();
}

private void initWorkerThread() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            Log.d("CustomHandler", "worker (looper) thread initialized");
            while (true) {
                Runnable runnable;
                try {
                    runnable = mQueue.take();
                } catch (InterruptedException e) {
                    return;
                }
                if (runnable == POISON) {
                    Log.d("CustomHandler", "poison data detected; stopping working thread");
                    return;
                }
                runnable.run();
            }
        }
    }).start();
}

public void stop() {
    Log.d("CustomHandler", "injecting poison data into the queue");
    mQueue.clear();
    mQueue.add(POISON);
}

public void post(Runnable job) {
    mQueue.add(job);
}
}

我想指出一个问题,您自己不使用处理程序将int值从一个线程传递到另一个线程。处理程序用于在另一个线程中运行任务。如果要在两个线程之间共享变量,请考虑使用volatile关键字和原子变量。