android SDK核心功能 -- 消息传递与界面刷新
2016-01-08 14:26
435 查看
今天来分享一下 项目中view刷新相关的核心功能。
android里线程之间消息的传递都是借助Handler来实现的
用到的场景主要是是Activity、Fragment、Application 、Service、Thread之间的消息互相传递
此实现必须借助抽象类来实现即
BaseActivity BaseFragment PhoebeApp (现在不讨论Service之间的消息传递)
先来看一下BaseActivity的实现
其中BaseFragment的实现类似。省略
接下来看一下核心类
如果Thread发送的http请求 。请求完成以后
这个时候如果你Activity需要接收返回的结果
如果你想在多个Activity处理该http返回的结果。只需要在Activity的handleMessage中加一个case就行了
如果需要在多个Activity中接收,这里需要注意一下handlerMessage的返回值
如果返回true 只会有一个Activity 接收到。剩下的都接收不到了。
android里线程之间消息的传递都是借助Handler来实现的
用到的场景主要是是Activity、Fragment、Application 、Service、Thread之间的消息互相传递
此实现必须借助抽象类来实现即
BaseActivity BaseFragment PhoebeApp (现在不讨论Service之间的消息传递)
先来看一下BaseActivity的实现
public abstract class BaseActivity extends Activity implements Handler.Callback{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMgr.push(this); findViewById(); } @Override public boolean handleMessage(Message msg) { return false; } @Override protected void onDestroy() { super.onDestroy(); ActivityMgr.remove(this); } }
其中BaseFragment的实现类似。省略
接下来看一下核心类
/** * app中用于UI/非UI线程通信的核心工具类<br> * 可以再"UI/非UI线程"往"UI线程"中发信息, 最终接收方为 {@link BaseActivity} {@link BaseFragment} {@link PhoebeApp} * * @author coffee<br> * 2015-12-26下午4:36:26 */ public class HandlerMgr { public static void sendMessage(int what) { int delayMillis = 0; final Message msg = Message.obtain(); msg.what = what; sendMessage(msg, delayMillis); } /** * 将消息发往Application、Activity、Fragment * * @param orig * @param delayMillis */ public static void sendMessage(Message orig, int delayMillis) { // 发往application Message appMessage = Message.obtain(orig); PhoebeApp.getHandler().sendMessage(appMessage); // 发往Activity ArrayList<?> activities = ActivityMgr.getAllActivities(); for (final Object activity : activities) { boolean result = handle(activity, orig, delayMillis); if (result == true) { break;// 停止继续分发该Message } else { continue; } } // 发往Fragment // ArrayList<?> fragments = FragmentMgr.getAllFragments(); // for (final Object fragment : fragments) { // boolean result = handle(fragment, orig, delayMillis); // if (result == true) { // break;// 停止继续分发该Message // } else { // continue; // } // } } <span style="white-space:pre"> </span> private static boolean handle(final Object activityOrFragment, Message orig, int delayMillis) { final Message msg = Message.obtain(orig); if (delayMillis == 0) { boolean result = false; if (activityOrFragment instanceof Handler.Callback) { ((Handler.Callback) activityOrFragment).handleMessage(msg); } return result; } else { PhoebeApp.getHandler().postDelayed(new Runnable() { @Override public void run() { if (activityOrFragment instanceof Handler.Callback) { ((Handler.Callback) activityOrFragment).handleMessage(msg); } } }, delayMillis); } return false; } }
如果Thread发送的http请求 。请求完成以后
public void run(){ // ...处理网络请求 Message msg = Message.obtain(); msg.what = 123; msg.obj = "{json字符串}"; HandlerMgr.sendMessage(msg, 0); }
这个时候如果你Activity需要接收返回的结果
@Override public boolean handleMessage(Message msg) { switch (msg.what) { case 123: String json = msg.obj + ""; //处理json数据 break; } }
如果你想在多个Activity处理该http返回的结果。只需要在Activity的handleMessage中加一个case就行了
如果需要在多个Activity中接收,这里需要注意一下handlerMessage的返回值
如果返回true 只会有一个Activity 接收到。剩下的都接收不到了。
for (final Object activity : activities) { boolean result = handle(activity, orig, delayMillis); if (result == true) { break;// 停止继续分发该Message } else { continue; } }
相关文章推荐
- Android Studio Mac版快捷键
- 2015年十大热门Android开源新项目
- android之APN详解
- android按键事件和触屏事件(四)-listview的setOnItemClickListener点击无效的处理
- MediaPlayer简介
- android-Transferring Data Without Draining the Battery
- android、java制作sdk以及自动生成文档
- [置顶] Android的fragment页面点击按钮切换到下一个fragment页面,由主activity控制
- google android volley framwork
- Android Fragment 真正的完全解析(上)
- 在Android中使用MVP
- Android5.0+(CoordinatorLayout)
- Android Handler内存泄露
- Android数据存储之SharedPreferences使用
- 【android】LayoutInflater.inflate方法的详解及xml根元素的布局参数不起作用的问题
- android 解决APN问题
- Android NDK开发之 NEON 矩阵转置,矩阵乘法实现
- android service 总结(2)
- Android studio gradle 多渠道打包
- Android studio 打包apk如何重命名apk名称