Android EventLine框架制作过程 二 Activity上主线程与子线程之间的通信
2018-01-30 19:29
459 查看
github项目代码地址,欢迎start
https://github.com/979451341/EventLine
接着上一篇继续写,这次我们要在接收函数上使用元注解来区别接收函数需要在哪个线程执行
@Target(ElementType.METHOD)[url=mailto:br/>@Retention(RetentionPolicy.RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
int value() default 0;
}
然后在EventLine里面添加两个常量
使用元注解
实现
我们需要得到activity的receive函数Process这个元注解的值来判断在哪个线程执行
得到元注解的值后根据情况来执行
在主线程发送信息
效果良好
01-25 16:57:27.562 31938-32011/com.example.zth.eventline V/zzw: MainActivity 接收到了来自ThreeActivity的消息
01-25 16:57:27.574 31938-32024/com.example.zth.eventline V/zzw: TwoActivity 接收到了来自ThreeActivity的消息
01-25 16:57:30.575 31938-32024/com.example.zth.eventline V/zzw: TwoActivity 接收结束
现在我们把发送信息的环节放在子线程
效果依旧良好
01-25 16:57:27.562 31938-32011/com.example.zth.eventline V/zzw: MainActivity 接收到了来自ThreeActivity的消息
01-25 16:57:27.574 31938-32024/com.example.zth.eventline V/zzw: TwoActivity 接收到了来自ThreeActivity的消息
01-25 16:57:30.575 31938-32024/com.example.zth.eventline V/zzw: TwoActivity 接收结束
但是还是对EventLine做出一些改动,在元注解说要在主线程执行接收函数,
贴出EventLine完整代码
public class EventLine<T> {
}
结束了,下一次写一下Fragment与Fragment、activity之间的消息传递
https://github.com/979451341/EventLine
接着上一篇继续写,这次我们要在接收函数上使用元注解来区别接收函数需要在哪个线程执行
@Target(ElementType.METHOD)[url=mailto:br/>@Retention(RetentionPolicy.RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
int value() default 0;
}
然后在EventLine里面添加两个常量
public final static int MainThread = 0; public final static int SubThread = 1;
使用元注解
@Process(EventLine.SubThread) public void receive(DataBean dataBean) throws InterruptedException { Log.v("zzw","TwoActivity 接收到了"+dataBean.data); Thread.sleep(3000); Log.v("zzw","TwoActivity 接收结束"); }
实现
我们需要得到activity的receive函数Process这个元注解的值来判断在哪个线程执行
final Method declaredMethod = cls.getDeclaredMethod("receive", ojb.getClass()); Annotation[] annotations = declaredMethod.getAnnotations(); for(Annotation annotation : annotations){ if(annotation.annotationType() == Process.class){ Process process = (Process)annotation; value = process.value(); } }
得到元注解的值后根据情况来执行
if(value == MainThread) declaredMethod.invoke(activity, (Object) ojb); else if(value == SubThread){ new Thread(new Runnable() { @Override public void run() { try { declaredMethod.invoke(activity, (Object) ojb); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }).start(); }
在主线程发送信息
DataBean dataBean = new DataBean(); dataBean.data = "来自ThreeActivity的消息"; EventLine.getInstance().postData(dataBean);
效果良好
01-25 16:57:27.562 31938-32011/com.example.zth.eventline V/zzw: MainActivity 接收到了来自ThreeActivity的消息
01-25 16:57:27.574 31938-32024/com.example.zth.eventline V/zzw: TwoActivity 接收到了来自ThreeActivity的消息
01-25 16:57:30.575 31938-32024/com.example.zth.eventline V/zzw: TwoActivity 接收结束
现在我们把发送信息的环节放在子线程
new Thread(new Runnable() { @Override public void run() { DataBean dataBean = new DataBean(); dataBean.data = "来自ThreeActivity的消息"; EventLine.getInstance().postData(dataBean); } }).start();
效果依旧良好
01-25 16:57:27.562 31938-32011/com.example.zth.eventline V/zzw: MainActivity 接收到了来自ThreeActivity的消息
01-25 16:57:27.574 31938-32024/com.example.zth.eventline V/zzw: TwoActivity 接收到了来自ThreeActivity的消息
01-25 16:57:30.575 31938-32024/com.example.zth.eventline V/zzw: TwoActivity 接收结束
但是还是对EventLine做出一些改动,在元注解说要在主线程执行接收函数,
if(value == MainThread){ activity.runOnUiThread(new Runnable() { @Override public void run() { try { declaredMethod.invoke(activity, (Object) ojb); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }); } else if(value == SubThread){ new Thread(new Runnable() { @Override public void run() { try { declaredMethod.invoke(activity, (Object) ojb); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }).start(); }
贴出EventLine完整代码
public class EventLine<T> {
public static EventLine eventLine;
public final static int MainThread = 0; public final static int SubThread = 1;
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(final T ojb){
for(final Activity activity : activities){
int value = 0;
Class<? extends Activity> cls = activity.getClass();
try {
final Method declaredMethod = cls.getDeclaredMethod("receive", ojb.getClass());
Annotation[] annotations = declaredMethod.getAnnotations();
for(Annotation annotation : annotations){
if(annotation.annotationType() == Process.class){
Process process = (Process)annotation;
value = process.value();
}
}
if(value == MainThread){
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
declaredMethod.invoke(activity, (Object) ojb);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
else if(value == SubThread){
new Thread(new Runnable() {
@Override
public void run() {
try {
declaredMethod.invoke(activity, (Object) ojb);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}).start();
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
}
结束了,下一次写一下Fragment与Fragment、activity之间的消息传递
相关文章推荐
- Android EventLine框架制作过程 二 Activity上主线程与子线程之间的通信
- Android EventLine框架制作过程 一 Activity上主线程的通信
- Android EventLine框架制作过程 三 Activity和Fragment之间的相互通信
- Android EventLine框架制作过程 一 Activity上主线程的通信
- Android EventLine框架制作过程 三 Activity和Fragment之间的相互通信
- Android EventLine框架制作过程 四 Service与Activity、Fragment通讯
- Android EventLine框架制作过程 四 Service、Activity、Fragm
- Android中使用开源框架EventBus3.0实现Fragment之间的通信交互
- Android UI线程与工作线程之间通信
- Android中使用开源框架EventBus3.0实现Fragment之间的通信交互
- Android中使用开源框架EventBus3.0实现Fragment之间的通信交互
- Android--Handler+Looper+MessageQueue+Thread线程之间的通信
- Android中Activity、Service和线程之间的通信
- Android中Activity、Service和线程之间的通信
- Android中线程之间的通信
- Android中Activity、Service和线程之间的通信
- Android中Activity、Service和线程之间的通信
- Android中使用开源框架EventBus3.0实现Fragment之间的通信交互
- Android:使用Handler在线程之间通信
- Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息