您的位置:首页 > 移动开发 > Android开发

Android EventLine框架制作过程 一 Activity上主线程的通信

2018-01-30 19:28 489 查看
github项目代码地址,欢迎start
https://github.com/979451341/EventLine

首先我要取名这个未来诞生的事件总线框架名字为EventLine,看起来不错吧,额,不过这是装X,这个系列的博客主要讲解如何实现事件总线,我的思路主要是通过泛型和反射来实现。

我做的事件总线传递信息是通过实体类,为了好用,这个实体类必须用户来定义,所以泛型就用上场了,然后存储各个Activity的时候都是保存为Activity类型,事件总线的接收函数名也是固定的,所以使用反射能够统一处理。

首先创建一个专门为了实现事件总线的工具类并用单例模式

public static EventLine eventLine;

private EventLine(){

}

public static EventLine getInstance(){

if(eventLine == null){
synchronized (EventLine.class){
if(eventLine == null)
eventLine = new EventLine();
}
}
return eventLine;

}

然后我们需要保存各个Activity,顺便实现退出全部Activity

private ArrayList<Activity> activities = new ArrayList<Activity>();

public void addActivity(Activity activity){
activities.add(activity);
}

public void removeActivity(Activity activity){
activities.remove(activity);
}

public void finishAll(){
for(Activity activity : activities){
activity.finish();
}
}

现在能够在Activity里注册和注销了

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

EventLine.getInstance().addActivity(this);
}

@Override
protected void onDestroy() {
EventLine.getInstance().removeActivity(this);
super.onDestroy();
}

但是真正的功能还没实现,遍历保存的Activity,然后通过反射调用receive函数,并通过泛型把参数传输通过

public void postData(T ojb){

for(Activity activity : activities){
Class<? extends Activity> cls = activity.getClass();
try {
Method declaredMethod = cls.getDeclaredMethod("receive", ojb.getClass());
declaredMethod.invoke(activity, (Object) ojb);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}

}

在Activity里添加接收函数

public void receive(DataBean dataBean){
Log.v("zzw","MainActivity 接收到了"+dataBean.data);
}

触发消息传递

DataBean dataBean = new DataBean();
dataBean.data = "来自ThreeActivity的消息";
EventLine.getInstance().postData(dataBean);

效果良好

01-25 14:20:57.673 22209-22209/com.example.zth.eventline V/zzw: MainActivity 接收到了来自ThreeActivity的消息
01-25 14:20:57.673 22209-22209/com.example.zth.eventline V/zzw: TwoActivity 接收到了来自ThreeActivity的消息

完整的事件总线代码如下:

public class EventLine<T> {
public static EventLine eventLine;

private EventLine(){

}

public static EventLine getInstance(){

if(eventLine == null){
synchronized (EventLine.class){
if(eventLine == null)
eventLine = new EventLine();
}
}
return eventLine;

}

private ArrayList<Activity> activities = new ArrayList<Activity>(); public void addActivity(Activity activity){ activities.add(activity); } public void removeActivity(Activity activity){ activities.remove(activity); } public void finishAll(){ for(Activity activity : activities){ activity.finish(); } }

public void postData(T ojb){ for(Activity activity : activities){ Class<? extends Activity> cls = activity.getClass(); try { Method declaredMethod = cls.getDeclaredMethod("receive", ojb.getClass()); declaredMethod.invoke(activity, (Object) ojb); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } }

}

下一次就说如何实现Activity上主线程和子线程的通讯
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  APT