14908


`DialogFragment`を親クラスとする`ConfirmDialogFragment`を作成しました。  
このダイアログは名前の通り確認用のダイアログで、「〜しますか？」というメッセージに対して[はい]を選んだ時に〜の処理を行います。  
確認用のダイアログには2パターンがあり、それぞれ処理も異なります。  
そこで、その処理を呼び出し元に定義できるように[はい]が押されたら`EventBus`で呼び出し元クラスに通知してそこで処理を行うようにしようと思いました。  
使用している`EventBus`は`de.greenrobot:eventbus:2.4.0`です。  
確認ダイアログを表示するクラスは`MainActivity`と`SettingWebView`の2つです。

`MainActivity`が確認ダイアログを表示する時は戻るボタンでアプリを終了させようとする時です。  
`MainActivity`はもともと"非同期のログイン処理が終わったから画面を切り替えてほしい"などのイベントを受け取るようにしているので、`onStart`で登録して`onStop`で登録削除するようにしていました。

`SettingWebView`が確認ダイアログを表示する時は画像をダウンロードをしようとする時です。  
`SettingWebView`の方は特になにかしら`EventBus`からのイベントを受け取るようにしていません。  
そこで、`SettingWebView`の方では確認ダイアログ表示前に登録してイベント受け取り後に登録削除することにしました。

`EventBus`では`register(Object subscriver,int
priority)`を用いて優先度を設定できるとのことで、`SettingWebView`の優先度を`MainActivity`より高くすれば問題ないだろうと思っていました。  
デフォルトが0に設定されていると書いてあり、適当に`SettingWebView`を登録する時に1に指定してみたのですが、`MainActivity`が受け取ってしまいました。

受け取り元メソッドはそれぞれ`onEvent`と`onEventMainThread`を試してみたのですが、どちらでもうまくいきませんでした。  
"数値が大きい方が優先度が高い"という考えが違うのかと思い、`MainActivity`はデフォルト(0)で`SettingWebView`は-1で登録してみたのですが、それでもうまくいきませんでした。  
"とにかく0が一番優先度高いのかも？"と`MainActivity`は0以外で`SettingWebView`は0で登録してみたのですが、それでもうまくいきませんでした。  
-1,0,1以外の数値も試してみたのですが、どれもうまくいきませんでした。

どうすれば`SettingWebView`で確認ダイアログからのイベントを受け取れるようになるでしょうか？


CC BY-SA 3.0
2015-08-20T03:45:03.087
14650
2015-08-28T07:46:05.223
9710
question
android dialog eventbus
EventBusの通知優先度の設定について


改めて調べてみたところ、下記サイトを見つけました。  
[EventBus进阶(二) - 砺雪凝霜 - ITeye技术网站](http://1029457926.iteye.com/blog/2211820)
([Google 翻訳](https://translate.google.co.jp/translate?hl=ja&sl=zh-
CN&u=http://1029457926.iteye.com/blog/2211820&prev=search))

そこには以下のように書かれていました。

> 在同一个线程级别中，订阅者的优先级越高，就越先收到消息，默认优先级是0  
>  (同じスレッドレベルでは、より優先度の高い加入者は、複数のメッセージを受信するために、デフォルトの優先度は0です (Google翻訳))

書いてあることは公式とそんな変わりませんが、改めて試してみようと思いました。

使用したコードは以下です。

[code]

    //MainActivityの登録　Activity#onStart内で
    EventBus.getDefault().register(this);
    //MainActivityでの受け取り用メソッド
    public void onEvent(String event){
        System.out.println("MainActivityは受け取りました。");
    }
    
    //SettingWebViewの登録　View.OnLongClickListener内で
    EventBus.getDefault().register(SettingWebView.this,1);
    //SettingWebViewでの受け取り用メソッド
    public void onEvent(String event){
        System.out.println("SettingWebViewは受け取りました。");
    }
    
    //ConfirmDialogFragmentのPositiveButtonに対するDialogInterfase.OnClickListener内で
    EventBus.getDefault().post("通知テスト");
    
[/code]

すると今度はどちらも出力されました。  
この場合`MainActivity`への通知はいらないのでJavaの`*Event#consume`的なものは  
ないか探したところ、`SettingWebView#onEvent`内で以下のように書くことで  
通知は`SettingWebView`だけになり`MainActivity`への通知はされませんでした。

[code]

    EventBus.getDefault().cancelEventDelivery(event);
    
[/code]

* * *

  
うまくいかなかった時はもしかしたら`SettingWebView`では`SettingWebView.this`ではなく  
`this`(View.OnLongClickListenerの無名クラス)を渡してしまっていたのかもと試すと、

[code]

    W/System.err﹕ de.greenrobot.event.EventBusException: Subscriber class jp.co.sencorp.haicheeseapp.SettingWebView$3 has no public methods called onEvent
    
[/code]

というエラーメッセージが出ました。  
もしかしたら質問する前に試した時は`.out`フィルタリング(Logcatに標準出力以外表示させない)  
をかけて見落としていただけなのかもしれません。


CC BY-SA 3.0
2015-08-27T10:44:22.910
14908
2015-08-28T07:46:05.223
2015-08-28T07:46:05.223
9710
9710
14650
answer