我已经Otto
在我最新的 Android 项目中进行了尝试,它确实大大简化了对象之间的通信。但是,我不确定线程之间的通信是否存在任何隐藏问题。
这就是我所做的,SingletonBus
使用 an创建了一个enum
,以便总线可以在任何地方访问:
public enum SingletonBus {
INSTANCE;
private static String TAG = SingletonBus.class.getSimpleName();
private Bus bus;
private boolean paused;
private final Vector<Object> eventQueueBuffer = new Vector<>();
private Handler handler = new Handler(Looper.getMainLooper());
private SingletonBus() {
this.bus = new Bus(ThreadEnforcer.ANY);
}
public <T> void postToSameThread(final T event) {
bus.post(event);
}
public <T> void postToMainThread(final T event) {
try {
if(paused) {
eventQueueBuffer.add(event);
} else {
handler.post(new Runnable() {
@Override
public void run() {
try {
bus.post(event);
} catch(Exception e) {
Log.e(TAG, "POST TO MAIN THREAD: BUS LEVEL");
throw e;
}
}
});
}
} catch(Exception e) {
Log.e(TAG, "POST TO MAIN THREAD: HANDLER LEVEL");
throw e;
}
}
public <T> void register(T subscriber) {
bus.register(subscriber);
}
public <T> void unregister(T subscriber) {
bus.unregister(subscriber);
}
public boolean isPaused() {
return paused;
}
public void setPaused(boolean paused) {
this.paused = paused;
if(!paused) {
Iterator<Object> eventIterator = eventQueueBuffer.iterator();
while(eventIterator.hasNext()) {
Object event = eventIterator.next();
postToMainThread(event);
eventIterator.remove();
}
}
}
}
然后我创建了一个Event
可以包含操作结果的内容(我还没有继承任何东西,而是为每个操作创建一个事件,但是如果有必要,我会尝试重构它,因为它会变得混乱):
public class KeyPairCreatedEvent {
private KeyPair keyPair;
public KeyPairCreatedEvent(KeyPair keyPair) {
this.keyPair = keyPair;
}
public KeyPair getKeyPair() {
return keyPair;
}
}
然后我创建并发布了这个事件:
@Subscribe
public void keyPairCreate(KeyPairCreateEvent keyPairCreateEvent) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
KeyPair keyPair = keyPairCreator.createKeyPair();
SingletonBus.INSTANCE.getBus().post(new KeyPairCreatedEvent(keyPair));
} catch(...){...}
}
});
thread.start();
}
并订阅了一个事件以在创建密钥对时获取结果:
@Subscribe
public void keyPairCreated(KeyPairCreatedEvent keyPairCreatedEvent) {
Log.d(MainActivity.class.getName(), "Acquired keypair: " + keyPairCreatedEvent.getKeyPair());
//do stuff
}
我的问题是,它似乎正在工作,但是使用 Otto 与ThreadEnforcer.ANY
线程之间进行通信是否存在任何隐藏错误?这种方法有什么问题吗?