Android. Otto Bus не запускает событие из метода onActivityResult() Fragment to Activity

У меня есть BaseActivity с методами register () и unregister ():

public class BaseActivity extends AppCompatActivity{

    ...

    @Override
    protected void onResume() {
        super.onResume();
        // Register ourselves so that we can provide the initial value.
        BusProvider.getInstance().register(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // Always unregister when an object no longer should be on the bus.
        BusProvider.getInstance().unregister(this);
    }

    protected void setFragment(Fragment fragment){
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(ROOT_CONTAINER_ID, fragment);
        if(!isFinishing()) {
            transaction.commitAllowingStateLoss();
        }
    }


}

У меня есть ChildActivity, который запускает DoneEvent для фрагмента FrDetails, и он работает нормально.

public class ChildActivity extends BaseActivity implements View.OnClickListener{

    private ImageView btnDone;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        btnDone = (ImageView) toolbarView.findViewById(R.id.btnDone);
        btnDone.setOnClickListener(this);

        setFragment(FrDetails.newInstance());
    }    

    @Override
    public void onClick(View v) {
        int viewId = v.getId();

        switch (viewId){
            case R.id.btnDone:

                BusProvider.getInstance().post(new DoneEvent());

                break;
            default:
                break;
        }
    }

    @Subscribe
    public void onDataFilled(DataFilledEvent event) {
        Log.e("Data filled", "Yessss");
    }
}

Но DataFilledEvent не запускает ChildActivity из метода onActivityResult фрагмента FrDetails. Я вызвал методы register () и unregister () во фрагменте FrBase. Фрагмент FrDetails является дочерним для фрагмента FrBase.

public abstract class FrBase extends Fragment {
    ...

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

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

}

Это мой класс FrDetails:

import com.squareup.otto.Subscribe;

public class FrDetails extends FrBase implements View.OnClickListener{

...

   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View baseView = inflater.inflate(R.layout.one_fragment, null);
        button = (Button) baseView.findViewById(R.id.btn1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //WORK FINE HERE!
                BusProvider.getInstance().post(new DataFilledEvent());
            }
        });

        button2 = (Button) baseView.findViewById(R.id.btn2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getBaseActivity(), ThirdActivity.class);
                startActivityForResult(intent, SELECT_YEAR);
            }
        });
    }

    @Subscribe
    public void onDone(DoneEvent event) {
        //WORKS FINE HERE!
        Toast.makeText(getActivity(), "Done", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        //Log is called correctly
        Log.e("OK", "log");

        //DOENS'T WORK HERE!
        BusProvider.getInstance().post(new DataFilledEvent());

    }
}

Почему BusProvider.getInstance(). Post(new DataFilledEvent()); не запускает событие из onActivityResult() в ChildActivity? Но это работает, если мы запускаем событие нажатием на кнопку во фрагменте FrDetails.

Заранее спасибо.

2 ответа

Решение

На основании документации поonActivityResult() (только соответствующий фрагмент):

Вы получите этот вызов непосредственно перед onResume(), когда ваша деятельность возобновится.

Другими словами, событие запускается до того, как ваша активность зарегистрировалась на шине, потому что регистрация происходит в onResume(),

Если вы хотите иметь возможность инициировать и получать события на более ранней стадии жизненного цикла действия, вам следует соответствующим образом изменить регистрацию (и отмену регистрации).

Кроме того, вы можете сойти с рук, просто зарегистрировавшись в onActivityResult() также. Некоторое время я не смотрел на код Отто, но я представляю, что регистрация уже зарегистрированного обработчика событий не приведет к тому, что обработчик получит события более одного раза. Обратите внимание, что в этом случае вам нужно будет принять во внимание тот факт, что ваша деятельность может быть не в том состоянии, в котором вы ее ожидаете. То есть это будет где-то между onActivityResult() а также onResume(),

Что вы, вероятно, хотите сделать, это опубликовать событие как работоспособный. К моменту его запуска должно быть выполнено onStart|onResume, где вы регистрируете свою шину событий.

new Handler().post(new Runnable() {
        @Override
        public void run() {
            BusProvider.getInstance().post(new DataFilledEvent());
        }
    });
Другие вопросы по тегам