今天來分享一下 項目中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;
}
}
~~~
- 前言
- Android sdk開發 - 序
- Android sdk開發(一)Application設計
- Android sdk開發(二) Log日志類的設計
- Android SDK開發 (三) App的屬性配置
- android SDK開發-- 功能設計
- android SDK開發 -- TitleBar封裝(一)
- android SDK開發 -- TitleBar封裝(二)
- Android SDK開發 -- TitleBar重構 (代理模式的使用)
- Android SDK開發 -- TitleBar重構 (代理模式-優化)
- android SDK核心功能 -- 消息傳遞與界面刷新
- Android SDK開發 -- TitleBar重構 - 使用策略模式、舍棄代理模式