浅谈Android中使用异步线程更新UI视图的几种方法
程序员文章站
2023-12-02 18:41:16
在android中子线程是不能更新ui的。
所以我们要通过其他方式来动态改变ui视图,
1、runonuithread
activity提供的一个轻量级更新ui的方法...
在android中子线程是不能更新ui的。
所以我们要通过其他方式来动态改变ui视图,
1、runonuithread
activity提供的一个轻量级更新ui的方法,在fragment需要使用的时候要用getactivity.runonuithread开启线程
这种方法最简单,方便更新一些不需要判断的通知,比如在聊天项目中动态获取未读消息数量。
runonuithread(new runnable() { @override public void run() { sendmessage("[自动回复]你好,我是机器人"); } });
2、handler message
使用这个方法可以设置比如按钮倒计时的控制,也是比较常见的一种更新ui的方法。
创建一个主线程用于接收子线程不断发送的消息,通过msg.what判断传递的消息类型。
根据类型进行相关ui的更新操作。
创建线程用于接收:
private handler mhandler = new handler() { public void handlemessage(message msg) { switch (msg.what) { case 0: setresult(result_ok); timerbuttonactivity.this.finish(); break; case 4: mtimer1.setenabled(false); mtimer1.settext("已发送(" + string.valueof(time) + ")"); break; case 5: mtimer1.setenabled(true); mtimer1.settext("重新获取验证码"); time = 10; break; } } };
发送消息的方法:
mhandler.sendemptymessage(5);
3、handler runnable
同样也是需要先创建一个线程。
handler handler = new handler();
在一开始加载的地方使用postdelayed设置加载延迟
handler.postdelayed(new runnable() { @override public void run() { updatadata(); } }, 2000);
或者我们要进行一个自动刷新的动作,当动作完成时,隐藏刷新效果
//开启一个刷新的线程 mfragmentmainrf.post(new runnable() { @override public void run() { //开始 mfragmentmainrf.setrefreshing(true); } }); //监听刷新状态操作 mfragmentmainrf.setonrefreshlistener(new swiperefreshlayout.onrefreshlistener() { @override public void onrefresh() { //设置延迟刷新时间1500 handler.postdelayed(new runnable() { @override public void run() { //刷新数据 updatadata(); } }, 1800); } });
4、asynctask
asynctask可以更加轻松地使用ui线程。该类允许执行后台操作并在ui线程上更新视图,而不需要操纵线程和处理程序。
asynctask被设计为一个辅助类thread,handler 并且不构成通用线程框架。用于短时间更新操作。
在使用的时候需要继承asynctask并重写方法:
doinbackground:用于返回结果
onprogressupdate: onprogressupdate是在ui线程中执行,所有可以对ui空间进行操作
onpostexecute:接收doinbackground的返回结果,用于更新ui
class asynctaskwrapper extends asynctask<void, integer, object>{ @override protected object doinbackground(void... voids) { try { thread.sleep(2000); } catch (interruptedexception e) { e.printstacktrace(); } return null; } @override protected void onprogressupdate(integer... values) { super.onprogressupdate(values); log.e("progress",valuse); } @override protected void onpostexecute(object o) { super.onpostexecute(o); log.e("message",o); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。