返回介绍

消息传递与界面刷新

发布于 2025-02-25 12:45:31 字数 3824 浏览 0 评论 0 收藏 0

今天来分享一下 项目中 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文