方法一: view.post(Runnable action)
假如该方法是在子线程中
textView.post(new Runnable() { @Override public void run() { textView.setText("更新textView"); //还可以更新其他的控件 imageView.setBackgroundResource(R.drawable.update); } });
方法二: activity.runOnUiThread(Runnable action)
public void updateUI(final Context context) { ((MainActivity) context).runOnUiThread(new Runnable() { @Override public void run() { //此时已在主线程中,可以更新UI了 } }); }
如果没有上下文(context),试试下面的方法:
1.用view.getContext()可以得到上下文。 2.跳过context直接用new Activity().runOnUiThread(Runnable action)来切换到主线程。方法三: Handler机制
首先在主线程中定义Handler,Handler mainHandler = new Handler();(必须要在主线程中定义才能操作主线程,如果想在其他地方定义声明时要这样写Handler mainHandler = new Handler(Looper.getMainLooper()),来获取主线程的 Looper 和 Queue )
Handler mainHandler = new Handler(Looper.getMainLooper()); mainHandler.post(new Runnable() { @Override public void run() { //已在主线程中,可以更新UI } });
Handler还有下面的方法:
1.postAtTime(Runnable r, long uptimeMillis); //在某一时刻发送消息 2.postAtDelayed(Runnable r, long delayMillis); //延迟delayMillis毫秒再发送消息(2): 假设在主线程中
Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { switch(msg.what) { case 0: //更新UI等 break; case 1: //更新UI等 break; default: break; } } }
/** *获取消息,尽量用obtainMessage()方法,查看源码发现,该方法节省内存。 *不提倡用Messenger msg=new Messenger()这种方法,每次都去创建一个对象,肯定不节省内存啦! *至于为什么该方法还存在,估计还是有存在的必要吧。(留作以后深入研究) */ Message msg = myHandler.obtainMessage(); msg.what = 0; //消息标识 myHandler.sendMessage(msg); //发送消息
如上代码,只是发送了个消息标识,并没有传其他参数。
如果想传递参数,可以这样:msg.what = 1; //消息标识 msg.arg1=2; //存放整形数据,如果携带数据简单,优先使用arg1和arg2,比Bundle更节省内存。 msg.arg2=3; //存放整形数据 Bundle bundle=new Bundle(); bundle.putString("dd","adfasd"); bundle.putInt("love",5); msg.setData(bundle); msg.obj=bundle; //用来存放Object类型的任意对象 myHandler.sendMessage(msg); //发送消息
总结: msg.obj它的功能比较强大一下,至于它和利用Bundle传递数据,那个会效率高一些,更节省内存一些。个人认为:从传递数据的复杂程度看,由简单到复杂依次使用,arg1, setData(), obj。会比较好一些。
当然可以用简化方法sendEmptyMessage(int what)来减少不必要的代码,这样写:
myHandler.sendEmptyMessage(0); //其实内部实现还是和上面一样
发送消息的其他方法有:
endEmptyMessageAtTime(int what, long uptimeMillis); //定时发送空消息sendEmptyMessageDelayed(int what, long delayMillis); //延时发送空消息sendMessageAtTime(Message msg, long uptimeMillis); //定时发送消息sendMessageDelayed(Message msg, long delayMillis); //延时发送消息sendMessageAtFrontOfQueue(Message msg); //最先处理消息(慎用)