通常在user 退出或者登陆时 通知各个界面进行刷新。 或者当数据完成后通知
1.自定义回调 在 A类中 定义 接口 和接口方法,并在需要进行回调的地方 使用该方法
public class A_Fragment extends BaseFragment {
private onSwitchpaperListener onSwitchpaperListener;
//定义接口和接口方法
public interface onSwitchpaperListener{
void switchpaper(int i);
}
//对外提供一个设置监听的方法。
public void setOnSwichtpaerListener(onSwitchpaperListener listener){
this.onSwitchpaperListener=listener;
}
@Override
public void intiEvent() {
if(onSwitchpaperListener!=null){
onSwitchpaperListener.switchpaper(position);
}else {
}
}
}
在B fragment中 实现具体的操作逻辑,并传入A 中所需要的参数:
mainActivity.getAFragment().setOnSwichtpaerListener(new Slidingleft_Fragment.onSwitchpaperListener() {
@Override
public void switchpaper(int i) {
BaseCenterPaper currentPaper= baseCenterPaperList.get(i);
tv_title.setText(lists.get(i).getTitle());
//先移除
fl.removeAllViews();
currentPaper.initData();
fl.addView(currentPaper.getRoot());
}
});
主要是两个参数 resultcode requedecode
请求码用来判断是从那个Activity 发出的 resultcode 用来判断 是从哪个Acitivity返回的
这样 在 onActivityResult 方法中就能准却判断
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Contants.REQUEST_CODE && resultCode == this.RESULT_OK) {
Log.d("登录后mainActivity执行回调","ture");
new Thread() {
public void run() {
//这儿是耗时操作,完成之后更新UI;
runOnUiThread(new Runnable(){
@Override
public void run() {
//通知子view g
if (user != null) {
//更新mine
refrushMineView();
//更新购物车
refrushShopCarView();
}
else {
}
}
});
}
}.start();
}
if (requestCode == 2 && resultCode == 2) {
Log.d("购物车执行回调","ture");
new Thread() {
public void run() {
//这儿是耗时操作,完成之后更新UI;
runOnUiThread(new Runnable(){
@Override
public void run() {
//通知子view g
if(user!=null)
{
refrushShopCarView();
}
else {
}
}
});
}
}.start();
}
if (user != null) {
//跳转至目标Activity
if (MyApplication.getInstance(this).getIntent() == null) {
}
else {
MyApplication.getInstance(this).jumpToTargetActivity(this);
}
}
else {
}
}
注意事项!
onBack()回退方法! 要在super.onBack 之前 setResult 不然会无效, 所得值一直是0
1.定义事件基础类,通过注解代替枚举提供几种可选择的事件类型
public class CTEvent {
/**
* 事件类型
*/
@IntDef({TYPE_LOGIN, TYPE_CHECK_EMAIL})
@Retention(RetentionPolicy.SOURCE)
public @interface Type {
}
/**
* 登陆事件
*/
public static final int TYPE_LOGIN = 0;
/**
* 注册事件
*/
public static final int TYPE_CHECK_EMAIL = 1;
public @Type int type;
public CTEvent(@Type int type) {
this.type = type;
}
}
2.事件类型的封装,通过注解代替枚举的方式定义事件产生时的必要参数
/**
* 原因
*/
@IntDef({REASON_NONE, REASON_INVALID_PARAM})
@Retention(RetentionPolicy.SOURCE)
public @interface Reason {
}
/**
* 无错误
*/
public static final int REASON_NONE = 0;
/**
* 无效的参数
*/
public static final int REASON_INVALID_PARAM = 1;
public boolean result;
public @Reason int reason;
public CTLoginEvent(@Type int type, boolean result, @Reason int reason) {
super(type);
this.result = result;
this.reason = reason;
}
3.事件产生
EventBus.getDefault().post(new CTCheckEmailEvent(CTEvent.TYPE_CHECK_EMAIL, false, null));
4.事件接受, 这里需要注意,可将返回对象的逻辑在onEvent中集中处理,而不是分散出去
@Subscribe
public void onEvent(CTEvent event) {
switch (event.type) {
case CTEvent.TYPE_CHECK_EMAIL:
dealCheckEmailEvent((CTCheckEmailEvent) event);
break;
default:
break;
}
}
5.注意:
解注册
EventBus.getDefault().unregister(this);
另外,在一个类中并不能进行多次注册,所以一次事件执行,响应了两次逻辑,最大的可能就是产生了两个相同的对象。