私は最新の Android プロジェクトで試してみましたOtto
が、オブジェクト間の通信が大幅に簡素化されました。ただし、スレッド間の通信に隠れた問題があるかどうかはわかりません。
バスがどこからでもアクセスできるように、SingletonBus
を使用して を作成しました。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
}
私の質問は、それは機能しているようですが、ThreadEnforcer.ANY
スレッド間の通信に Otto を使用することで隠れたエラーが発生する可能性はありますか? このアプローチに問題はありますか?