java 线程更新ui_快速切换到主线程更新UI的几种方法

方法一: 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); //最先处理消息(慎用)

方法四: 使用AsyncTask

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值