对我来说有趣的是如何使用纯java来编写简单的Android Handler类来将信号从一个线程发送到另一个线程?
但是,例如如何编写可以从一个线程向另一个线程发送例如int值的类(Handler类)(不使用共享数据(如在Android Handler中?))?
答案 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关键字和原子变量。