view.post(Runnable action)
最近看了网上,在子线程更新UI的方法,说法很多,但都不是很全面。在此我争取做到总结的全面一些,希望以后对自己,对大家都有一些帮助。
方法一:view.post(Runnable action)**
textView.post(new Runnable() {
@Override public void run() { textView.setText("更新textView"); //还可以更新其他的控件 imageView.setBackgroundResource(R.drawable.update); } });
这是view自带的方法,比较简单,如果你的子线程里可以得到要更新的view的话,可以用此方法进行更新。
view还有一个方法view.postDelayed(Runnable action, long delayMillis)用来延迟发送。
方法二: activity.runOnUiThread(Runnable action)
public void updateUI(final Context context) {
((MainActivity) context).runOnUiThread(new Runnable() { @Override public void run() { //此时已在主线程中,可以更新UI了 } }); }
假如该方法是在子线程中
注意:context 对象要是 主线程中的MainActivity,这样强转才可以。
如果没有上下文(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 后就很简单了,用handler.post(Runnable r)方法把消息处理放在该 handler 依附的消息队列中(也就是主线程消息队列)。
(1):假如该方法是在子线程中
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;
}
}
}之后可以把 mainHandler 当做参数传递在各个类之间,当需要更新UI时,可以调用sendMessage一系列方法来执行handleMessage里的操作。
假设现在在子线程了
/**
*获取消息,尽量用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); //最先处理消息(慎用)
博主真是太厉害了!!!
叼茂SEO.bfbikes.com
怎么收藏这篇文章?
怎么收藏这篇文章?
想想你的文章写的特别好https://www.ea55.com/
兄弟写的非常好 https://www.cscnn.com/
文章的确不错啊https://www.cscnn.com/
《死亡珠宝》泰国剧高清在线免费观看:https://www.jgz518.com/xingkong/59311.html
《亲爱的》恐怖片高清在线免费观看:https://www.jgz518.com/xingkong/144682.html
《金喜澡堂》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/127403.html
《鬼使神差1987》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/134642.html
《西厢记1965国语》爱情片高清在线免费观看:https://www.jgz518.com/xingkong/28966.html
《真爱如血第四季》欧美剧高清在线免费观看:https://www.jgz518.com/xingkong/34053.html
《疾风使命》动作片高清在线免费观看:https://www.jgz518.com/xingkong/103910.html
《金喜澡堂》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/127403.html
《哈哈哈哈哈第三季》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/56086.html
《不能没有爱》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/61316.html
《外来媳妇本地郎4》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/31543.html
《哈哈哈哈哈第三季》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/56086.html
哈哈哈,写的太好了https://www.lawjida.com/
新车即将上线 真正的项目,期待你的参与coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com