2016-04-11 8 views
0

私はHello Ottoの基本プロジェクトで、どのように動作するかを学ぶために働いています。これはOtto 7.0.1のBusProviderです。 MainActivityには、バスオブジェクトに文字列をポストする最初のものをタップした後、2つのボタンがあります。これは私のBusProviderバスクラスを使用してMain2Activityに文字列を送信しますOttoは@Subscribeを呼び出さない

public class BusProvider { 

    private BusProvider() {} 

    private static Bus bus; 
    public static Bus getInstance() { 
     if (bus == null){ 
      bus = new Bus(); 
     } 
     return bus; 
    } 
} 

MainActivityある

public class MainActivity extends AppCompatActivity { 

    private Bus bus; 
    @Bind(R.id.myButton)Button mButton; 
    @Bind(R.id.button2)Button mButton2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     setLibreries(); 
     this.bus = BusProvider.getInstance(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 

    public void setLibreries(){ 
     ButterKnife.bind(this); 
    } 

    @OnClick(R.id.myButton) 
    protected void buttonPressed1(){ 
     Toast.makeText(this, "click on the 1 button",Toast.LENGTH_SHORT).show(); 
     BusProvider.getInstance().post("HELLO OTTO"); 
     Intent intent = new Intent(MainActivity.this,Main2Activity.class); 
     startActivity(intent); 
    } 

    @OnClick(R.id.button2) 
    protected void buttonPressed(){ 
     Toast.makeText(this, "click on the 2 button",Toast.LENGTH_SHORT).show(); 
    } 

} 

文字列に

public class Main2Activity extends AppCompatActivity { 

    private Bus bus; 

    @Bind(R.id.this_is_a_text_view) TextView myTextButter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main2); 
     bus = BusProvider.getInstance(); 
     ButterKnife.bind(this); 
     myTextButter.setText("HELLO"); 
    } 

    @Override 
    protected void onResume() { 
     BusProvider.getInstance().register(this); 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     BusProvider.getInstance().unregister(this); 
    } 

    @Subscribe 
    public void gettingStringPosted(String message){ 
     Log.d("OTTO", "OTTO subscribe has been called "+message); 
     Toast.makeText(this,message,Toast.LENGTH_SHORT).show(); 

    } 
} 

問題をどのように受け取るかMain2ActivityがあるものとトーストメッセージMainActivityにMainActivityで送信しています

ハローオットー

は表示されません。
私は間違っていますか?

+0

でMainActivity

Intent intent = new Intent(getBaseContext(), Main2Activity.class); intent.putExtra("MY_INFO", "INFO"); startActivity(intent) 

私のコメントにあなたのために言及した何をMainActivityでバスを登録してみましたか? –

+0

はい、私はonResumeでしましたが、うまくいきません。 – JoCuTo

+0

これで、BusProviderをMain2ActivityのonResumeメソッドに登録しても問題ありません。しかし、あなたはMain2Activityが作成される前に投稿しています。これはどうしてできますか? – Blackkara

答えて

1

あなたのBusProvider.getInstance().post("HELLO OTTO");ラインが来たとき、Main2ActivityがまだOttoに登録されていないという問題があります。ここで

はあなたのコードが行う方法です:

  1. Bus.post()
  2. Bus.register()

これは、それが行くべきかです:

  1. バス.register()
  2. Bus.post()

(onResumeで)あなたのレジスタ・コールがまだ後の後のコールが起こることができるようにActivity.onResume()はすぐに呼ばれないことがありますので、あなたはstartActivity()コールの下の行BusProvider.getInstance().post("HELLO OTTO");を移動することでこの問題を解決することはできません。これがあなたにとって理にかなったことを願っています。

+0

ありがとうございます。 Main2Activityは、クリックメソッドの後に作成されるため、登録できません。そうではありませんか? ...あなたのソリューションをstartActivityに移してみましたが、うまくいきませんでした。 – JoCuTo

+0

確かにclickメソッドの後に登録できますが、すぐに登録できないかもしれません。だから私が言っていることは、このような状況でオットーを使わないということです。 – vilpe89

+0

got it !!! :)ありがとう! – JoCuTo

1

これは、それがどのようなものかを理解するためのちょっとした例です。あなたがサービスを持っていて、その場所に場所を持ち、活動に送ると仮定しましょう。ただこれだけ

public class TrackingService extends Service { 

    Bus bus;  

    LocationListener mListener = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      bus.post(new MyLocation(location)); 
     } 
    }; 

    // Other service related methods.. 

} 

と活動

@Override 
protected void onResume() { 
    BusProvider.getInstance().register(this); 
    super.onResume(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    BusProvider.getInstance().unregister(this); 
} 

@Subscribe 
public void locationChanged(MyLocation location){ 
    Toast.makeText(this, "you got new location", Toast.LENGTH_SHORT).show(); 
} 

。ところで

、これは私がMain2Activity

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.view); 

    Intent intent = getIntent(); 
    String info = intent.getStringExtra("MY_INFO"); 
} 
+0

おかげで多くの仲間 – JoCuTo

関連する問題