设为首页 收藏本站 662p开源网
开启辅助访问 切换到宽版

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

切换风格 立即注册 找回密码

安卓教程网

发表于 2018-2-1 15:43:15 | 显示全部楼层 |阅读模式
更多
github项目代码地址,欢迎start
https://github.com/979451341/EventLine
接着上一篇继续写,这次我们要在接收函数上使用元注解来区别接收函数需要在哪个线程执行
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Process {    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之间的消息传递

新浪微博达人勋

高级会员

816

积分

272

威望

0

金钱

Rank: 4

积分
816
发表于 2018-2-1 15:43:50 | 显示全部楼层
支持,楼下的跟上哈~

新浪微博达人勋

注册会员

122

积分

37

威望

5

金钱

Rank: 2

积分
122
发表于 2018-3-10 19:41:27 | 显示全部楼层
小白一个 顶一下

新浪微博达人勋

注册会员

133

积分

40

威望

5

金钱

Rank: 2

积分
133
发表于 2018-3-11 05:04:32 | 显示全部楼层
我也是坐沙发的

新浪微博达人勋

注册会员

72

积分

24

威望

0

金钱

Rank: 2

积分
72
发表于 2018-3-13 21:04:34 | 显示全部楼层
路过的帮顶

新浪微博达人勋

高级会员

2152

积分

710

威望

8

金钱

Rank: 6Rank: 6

积分
2152

社区QQ达人热心会员

发表于 2018-3-15 22:23:28 | 显示全部楼层
支持你哈...................................

新浪微博达人勋

注册会员

83

积分

27

威望

1

金钱

Rank: 2

积分
83
发表于 2018-3-24 12:15:18 | 显示全部楼层
呵呵,低调,低调!

新浪微博达人勋

注册会员

97

积分

29

威望

2

金钱

Rank: 2

积分
97
发表于 2018-3-29 20:47:50 | 显示全部楼层
LZ敢整点更有创意的不?兄弟们等着围观捏~

新浪微博达人勋

注册会员

75

积分

25

威望

0

金钱

Rank: 2

积分
75
发表于 2018-3-30 14:18:27 | 显示全部楼层
不知道怎样啊,顶先

新浪微博达人勋

高级会员

816

积分

272

威望

0

金钱

Rank: 4

积分
816
发表于 2018-4-4 04:47:23 | 显示全部楼层
不管怎样,先顶一下先。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Archiver|手机版|小黑屋|安卓教程网 ( 粤ICP备12089784号  

GMT+8, 2018-8-21 14:34 , Processed in 1.257605 second(s), 52 queries .

Powered by Discuz X3.1

© 2001-2013 IOS教程网

快速回复 返回顶部 返回列表