今天来分享一下 项目中view刷新相关的核心功能。

    android里线程之间消息的传递都是借助Handler来实现的

    用到的场景主要是是Activity、Fragment、Application 、Service、Thread之间的消息互相传递

    此实现必须借助抽象类来实现即

    BaseActivity BaseFragment PhoebeApp (现在不讨论Service之间的消息传递)

    先来看一下BaseActivity的实现

    1. public abstract class BaseActivity extends Activity implements Handler.Callback{
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. ActivityMgr.push(this);
    6. findViewById();
    7. }
    8. @Override
    9. public boolean handleMessage(Message msg) {
    10. return false;
    11. }
    12. @Override
    13. protected void onDestroy() {
    14. super.onDestroy();
    15. ActivityMgr.remove(this);
    16. }
    17. }
    18.  

    其中BaseFragment的实现类似。省略

    接下来看一下核心类

    1. /**
    2. * app中用于UI/非UI线程通信的核心工具类<br>
    3. * 可以再"UI/非UI线程"往"UI线程"中发信息, 最终接收方为 {@link BaseActivity} {@link BaseFragment} {@link PhoebeApp}
    4. *
    5. * @author coffee<br>
    6. * 2015-12-26下午4:36:26
    7. */
    8. public class HandlerMgr {
    9. public static void sendMessage(int what) {
    10. int delayMillis = 0;
    11. final Message msg = Message.obtain();
    12. msg.what = what;
    13. sendMessage(msg, delayMillis);
    14. }
    15. /**
    16. * 将消息发往Application、Activity、Fragment
    17. *
    18. * @param orig
    19. * @param delayMillis
    20. */
    21. public static void sendMessage(Message orig, int delayMillis) {
    22. // 发往application
    23. Message appMessage = Message.obtain(orig);
    24. PhoebeApp.getHandler().sendMessage(appMessage);
    25. // 发往Activity
    26. ArrayList<?> activities = ActivityMgr.getAllActivities();
    27. for (final Object activity : activities) {
    28. boolean result = handle(activity, orig, delayMillis);
    29. if (result == true) {
    30. break;// 停止继续分发该Message
    31. } else {
    32. continue;
    33. }
    34. }
    35. // 发往Fragment
    36. // ArrayList<?> fragments = FragmentMgr.getAllFragments();
    37. // for (final Object fragment : fragments) {
    38. // boolean result = handle(fragment, orig, delayMillis);
    39. // if (result == true) {
    40. // break;// 停止继续分发该Message
    41. // } else {
    42. // continue;
    43. // }
    44. // }
    45. }
    46. <span style="white-space:pre"> </span>
    47. private static boolean handle(final Object activityOrFragment, Message orig, int delayMillis) {
    48. final Message msg = Message.obtain(orig);
    49. if (delayMillis == 0) {
    50. boolean result = false;
    51. if (activityOrFragment instanceof Handler.Callback) {
    52. ((Handler.Callback) activityOrFragment).handleMessage(msg);
    53. }
    54. return result;
    55. } else {
    56. PhoebeApp.getHandler().postDelayed(new Runnable() {
    57. @Override
    58. public void run() {
    59. if (activityOrFragment instanceof Handler.Callback) {
    60. ((Handler.Callback) activityOrFragment).handleMessage(msg);
    61. }
    62. }
    63. }, delayMillis);
    64. }
    65. return false;
    66. }
    67. }

    如果Thread发送的http请求 。请求完成以后

    1. public void run(){
    2. // ...处理网络请求
    3. Message msg = Message.obtain();
    4. msg.what = 123;
    5. msg.obj = "{json字符串}";
    6. HandlerMgr.sendMessage(msg, 0);
    7. }
    8.  

    这个时候如果你Activity需要接收返回的结果

    1. @Override
    2. public boolean handleMessage(Message msg) {
    3. switch (msg.what) {
    4. case 123:
    5. String json = msg.obj + "";
    6. //处理json数据
    7. break;
    8. }
    9. }
    10.  

    如果你想在多个Activity处理该http返回的结果。只需要在Activity的handleMessage中加一个case就行了

    如果需要在多个Activity中接收,这里需要注意一下handlerMessage的返回值

    如果返回true 只会有一个Activity 接收到。剩下的都接收不到了。

    1. for (final Object activity : activities) {
    2. boolean result = handle(activity, orig, delayMillis);
    3. if (result == true) {
    4. break;// 停止继续分发该Message
    5. } else {
    6. continue;
    7. }
    8. }