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());
}
});