子线程中更新主线程中的UI

大家已知处理在线程中更新UI的方法有两种普遍方法:
1.异步任务
2.发送广播

下面介绍的这个方法可以有效、简单的解决这个问题。
关于EventBus的介绍这里就不写了,只是记录一下其简单应用。

根据需要可以在活动开始和结束时添加EventBus的注册和注销。
@Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //注册
        EventBus.getDefault().register(this);
}
@Override
    protected void onDestroy() {

        //注销
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }


在简单的button中改变界面中的textView
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  new Thread(new Runnable() {
                      @Override
                      public void run() {
                          //网络操作
  
                          Log.d(TAG, "post");
                          //发布一个事件:  String
                          EventBus.getDefault().post("info");
                      }
                  }).start();

            }
        });

/**
     * 订阅
     * 不加 threadMode 默认在哪发的时间就从那个线程执行 与POSTING相同
     * ThreadMode.MAIN 在创建方法中的线程中执行
     * @param info  该方法是否收到数据取决于参数的类型  类型相同就可以收到发送数据
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void updateInfo(String info){
        //更新UI
        textView.setText(info);
        Log.d("MAIN", Thread.currentThread().getName());
        Log.d("MAIN", info);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void showInfo(Info info){
        textView.setText(info.toString());
    }

    class Info{
        private int i = 0;
        private int j = 1;
    }

    @Subscribe(threadMode = ThreadMode.POSTING)
    public void updateInfo2(String info) {
        //更新UI
//        textView.setText(info);
        Log.d("POSTING", Thread.currentThread().getName());
        Log.d("POSTING", info);
    }

    /**
     * 如果在主线程中发布事件,该方法启动子线程执行
     * 如果在子线程中发布事件,该方法在当前子线程执行方法
     * @param info
     */
    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void updateInfo3(String info){
        Log.d("BACKGROUND", Thread.currentThread().getName());
        Log.d("BACKGROUND", info);
    }

    /**
     * 在新线程执行该方法(不在当前线程)
     * 主线程发布事件,在子线程中执行
     * 子线程发布事件,启动新的子线程执行
     * @param info
     */
    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void updateInfo4(String info){
        Log.d("ASYNC", Thread.currentThread().getName());
        Log.d("ASYNC", info);
    }


相应工具包附件里有

猜你喜欢

转载自2548540761.iteye.com/blog/2281161