您的位置:首页 > 产品设计 > UI/UE

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

2016-03-08 19:46 495 查看
大家已知处理在线程中更新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() {
@Overrid 4000 e
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);
}


相应工具包附件里有
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: