2

オットーバスの例を実装しました。正常に動作しますが、アクティビティに 2 回目にアクセスしたときのみです。

たとえば、アプリを読み込んで秘密のメッセージ ボタンを押すと、アクティビティに移動しますが、トーストは表示されません。次に、[戻る] ボタンを押して MainActivity に戻り、[シークレット メッセージの表示] ボタンをもう一度押します。シークレット メッセージ アクティビティに移動すると、トーストが表示されます。イベントの登録を解除しないことでリークが発生したため、2 回目には機能することがわかりました。

ロジックについて私が見逃しているものはありますか?

主な活動:

public class MainActivity extends AppCompatActivity {

    Button buttonSecretMessage;
    Intent intentToMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        intentToMessage = new Intent(MainActivity.this, SecretMessageActivity.class);

        buttonSecretMessage = (Button) findViewById(R.id.buttonSecretMessage);

        buttonSecretMessage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                EventBus.getInstance().post(new MakeMySecretMessageEvent());
                startActivity(intentToMessage);

            }
        });
    }
}

秘密のメッセージ アクティビティ:

public class SecretMessageActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_secret_message);

    }

    @Subscribe
    public void getMySecretMessage(MakeMySecretMessageEvent event){

        Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show();

    }

    @Override
    protected void onStart(){
        super.onStart();

        EventBus.getInstance().register(this);

    }

    @Override
    protected void onStop() {
        super.onStop();

        //EventBus.getInstance().unregister(this);

    }
}

MakeMySecretMessageEvent:

public class MakeMySecretMessageEvent {

    public MakeMySecretMessageEvent() {

    }

    public String getMessage() {

        String message = "YOU ARE AWESOME!";

        return message;
    }

}

イベントバス:

public final class EventBus extends Bus{
    private static final EventBus Bus = new EventBus();

    public static Bus getInstance() {
        return Bus;
    }

    private EventBus() {
    }

}
4

3 に答える 3

1

EventBus ライブラリを使用してスティッキー イベントを送信できます。まだ作成されていないコンポーネントにイベントを送信できます。

詳細については、こちらをご覧ください。

于 2016-03-07T23:33:10.573 に答える
0

貢献者のおかげで、アクティビティのライフ サイクルと、それがイベント バスにどのように適合するかをよりよく理解できるようになりました。つまり、MainActivity からその子にイベントを送信することはできませんが、その逆です。以下は、簡単なオブジェクトをアクティビティからメイン アクティビティに戻すための otto イベント バスの実装方法を示しています。うまくいけば、他の誰かがこれが役立つと思うでしょう:)そして、これを改善できる場合はコメントしてください。ありがとう。

主な活動:

public class MainActivity extends AppCompatActivity {

    Button buttonSecretMessage;
    Intent intentToMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EventBus.getInstance().register(this);

        intentToMessage = new Intent(MainActivity.this, SecretMessageActivity.class);

        buttonSecretMessage = (Button) findViewById(R.id.buttonSecretMessage);

        buttonSecretMessage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                startActivity(intentToMessage);

            }
        });
    }
    public MakeMySecretMessageEvent event;
    @Subscribe
    public void getMySecretMessage(MakeMySecretMessageEvent event) {

            Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show();

    }

    protected void onStop() {
        super.onStop();

        if(event != null ){

            EventBus.getInstance().unregister(this);
        }
    }
}

SecretMessageActivity (シークレット メッセージが作成される場所)

public class SecretMessageActivity extends AppCompatActivity {

    Button buttonClickToMeToSeeMessage;
    Intent intentToMain;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_secret_message);

        intentToMain = new Intent(SecretMessageActivity.this, MainActivity.class);

        buttonClickToMeToSeeMessage = (Button) findViewById(R.id.buttonClickToMeToSeeMessage);

        buttonClickToMeToSeeMessage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                MakeMySecretMessageEvent makeMySecretMessageEvent = new MakeMySecretMessageEvent();

                EventBus.getInstance().post(makeMySecretMessageEvent);

                startActivity(intentToMain);

            }
        });

    }

}

MakeMySecretMessageEvent

public class MakeMySecretMessageEvent {

    public MakeMySecretMessageEvent() {

    }

    public String getMessage() {

        String message = "YOU ARE AWESOME!";

        return message;
    }

}

イベントバス:

public final class EventBus extends Bus{
    private static final EventBus Bus = new EventBus();

    public static Bus getInstance() {
        return Bus;
    }

    private EventBus() {
    }

}
于 2016-03-07T23:19:48.490 に答える
0

ここで、インテントまたはバンドルを介して単純にデータを送信できる場合、EventBus は間違ったシナリオに適用されています。ある活動と別の活動との通信において、どちらがより信頼性があります。イベントの発生は瞬時であり、アクティビティの作成にはそれに応じて時間がかかるため、最初のクリックでイベントを受け取ることはありません。

そのため、バンドルまたはインテントを使用して、アクティビティへの通信を次々とセットアップしてみてください。

于 2016-03-07T15:43:52.947 に答える