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); }
相应工具包附件里有