大家已知处理在线程中更新UI的方法有两种普遍方法:
1.异步任务
2.发送广播
下面介绍的这个方法可以有效、简单的解决这个问题。
关于EventBus的介绍这里就不写了,只是记录一下其简单应用。
根据需要可以在活动开始和结束时添加EventBus的注册和注销。
在简单的button中改变界面中的textView
相应工具包附件里有
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);
}
相应工具包附件里有