我有使用register()和unregister()方法的BaseActivity:
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不会从FrDetails片段的 onActivityResult 方法触发ChildActivity。我在FrBase片段中调用了register()和unregister()方法。 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片段中的按钮来触发事件,它就有效。
提前致谢。
答案 0 :(得分:4)
基于documentation on onActivityResult()
(仅限相关代码段):
当您的活动重新开始时,您将在onResume()之前立即收到此电话。
换句话说,在您的活动已经在公交车上注册之前,会触发事件,因为注册发生在onResume()
。
如果您希望能够在活动生命周期的早期阶段触发和接收事件,则应相应地更改注册(和取消注册)。
或者,您也可以通过简单地在onActivityResult()
注册来逃脱。我暂时没有查看Otto的代码,但我想,注册已注册的事件处理程序不会导致处理程序多次接收事件。请注意,在这种情况下,您必须考虑到您的活动可能不在您期望的状态。也就是说,它将介于onActivityResult()
和onResume()
之间。
答案 1 :(得分:0)
您可能想要做的是将活动发布为可运行的。当它执行时,onStart | onResume应该执行你注册事件总线。
new Handler().post(new Runnable() {
@Override
public void run() {
BusProvider.getInstance().post(new DataFilledEvent());
}
});