子线程中更新主线程中的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);
}


相应工具包附件里有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值