文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
消息传递与界面刷新
今天来分享一下 项目中 view 刷新相关的核心功能。
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;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论