Android通过子线程更新UI的几种方式
Android通过子线程更新UI的几种方式
一般情况下,UI的更新都少不了Handler,首先我们先了解一下Handler机制:
Handler消息机制
定义
Message
线程间通信的数据单元,可通过message携带需要的数据创建对象:Message.obtain(what)
Handler
Handler是Message的处理器,同时也负责消息的发送和移除工作
发送即时消息:即使发送即时处理
发送延时消息:即时发送,过一会儿处理
MessageQueue:消息队列
用来存放通过Handler发送的消息,它是一个按Message的when排序的优先级队列
Looper:循环器
负责循环取出Message Queue里面的当前需要处理的Message,交给对应的Handler进行处理,处理完后,将Message缓存到消息池中,以备复用
Handler的基本使用
步骤:
①创建Handler成员变量,并重写其handleMessage()
②在分线程创建Message对象
③使用handler对象发送Message
④在handleMessage()中处理消息
消息机制原理
文字描述
从handler中获取一个消息对象,把数据封装到消息对象中,通过handler的send方法把消息push到MessageQueue队列中,looper对象会轮询MessageQueue队列,把消息对象取出。通过dispatchMessage分发给Handler,再回调用Handler实现的handleMessage方法处理消息。
接下来,我们再看在通过子线程更新UI常见的几种方式
子线程更新UI
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button update_handler; private Button update_ViewPost; private Button update_handlerPost; private Button update_handlerPostDelay; private Button update_RunOnUiThread; private Button update_AsyncTask; private TextView textView;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { update_handler=findViewById(R.id.button1); update_ViewPost=findViewById(R.id.button2); update_handlerPost=findViewById(R.id.button3); update_handlerPostDelay=findViewById(R.id.button4); update_RunOnUiThread=findViewById(R.id.button5); update_AsyncTask=findViewById(R.id.button6); textView=findViewById(R.id.myword); update_handler.setOnClickListener(this); update_ViewPost.setOnClickListener(this); update_handlerPost.setOnClickListener(this); update_handlerPostDelay.setOnClickListener(this); update_RunOnUiThread.setOnClickListener(this); update_AsyncTask.setOnClickListener(this); }
@Override public void onClick(View v) { switch (v.getId()){ case R.id.button1: update_handler(); break; case R.id.button2: update_ViewPost(); break; case R.id.button3: update_handlerPost(); break; case R.id.button4: update_handlerPostDelay(); break; case R.id.button5: update_RunOnUiThread(); break; case R.id.button6: new updateAsyncTask().execute(); break; } }
Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what==1){ textView.setText("小慕慕"); } } };
/*
方法1
*/
private void update_handler(){ new Thread(new Runnable() { @Override public void run() { Message message=handler.obtainMessage(); message.what=1; handler.sendMessage(message); } }).start(); } /* 方法2 */ private void update_ViewPost(){ new Thread(new Runnable() { @Override public void run() { textView.post(new Runnable() { @Override public void run() { textView.setText("小九九"); } });
} }).start(); } /* 方法3 */ private void update_handlerPost() { new Thread(new Runnable() { @Override public void run() { handler.post(new Runnable() { @Override public void run() { textView.setText("小酒酒"); } }); } }).start(); }
/*
方法4
*/
private void update_handlerPostDelay(){ new Thread(new Runnable() { @Override public void run() { handler.postDelayed(new Runnable() { @Override public void run() { textView.setText("九酒"); } },3000); } }).start(); }
/*
方法5
*/
private void update_RunOnUiThread(){ new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { textView.setText("慕九"); } }); } }).start(); }
/*
方法6
*/
class updateAsyncTask extends AsyncTask<String,Integer,String>{ @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(String... strings) { publishProgress(); return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); textView.setText("结束"); } }
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" >
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="handler" android:textAllCaps="false" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="View.post()" android:textAllCaps="false" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="handlerPost()" android:textAllCaps="false"/> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="handlerPostDelay()" android:textAllCaps="false"/> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="runOnUiThread()" android:textAllCaps="false"/> <Button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text=" update_AsyncTask()" android:textAllCaps="false"/> <TextView android:id="@+id/myword" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="慕九酒"/>
运行结果:
总结
其实这六种方式并没有太大的区别,前五种方式都是基于第一种方式的封装,都是采用的Thread+handler模式,第六种封装的更厉害了些,它是Thread+hanler+Threadpool。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
临近毕业,2020春招困惑你的十大问题,你中招了吗?
通过某知名网站搜集网友分享Android开发面经,很多Android开发者大都遇到了这些问题: 1. 现在安卓的形势,很多人都说不行了,我刚入行没多久是不是要跑路了呀? 2. 我是双非/三本/专科学校的,我有机会进入大厂吗? 3. 非计算机专业的学生能学好吗? 4. 如何学习Android? 5. Android学习该学哪些东西? 6. 我该如何准备Android面试? 7. 面试的简历准备注意事项有哪些呢? 8. 没有项目经历/博客/Github开源项目怎么办? 9. 大厂到底青睐什么样的应届生? 10. 如果面试官问你“你有什么问题问我吗?”时,你该如何回答? 下面我们一一回答这些方面的问题。我会根据自己的一点经验对大部分人关心的这些问题进行答疑解惑。 现在又刚好赶上年末,这篇文章也算是给2020春招准备往Android方向发展的朋友们指明一条学习之路。道理懂了如果没有实际行动,那这篇文章对你或许没有任何意义。 (1)Android开发前景? 我们通过智联招聘、拉勾网、Boss直聘、前程无忧发布的移动互联网招聘岗位需求发现:移动端的招聘量变少,但中高端的职位却多了起来,这说明行业只...
- 下一篇
区块链研究论文整理【七】
区块链作为一种崭新的、颠覆性的技术,是国内外活跃的研究领域和毕业设计选题方向。本文列出最新的一组区块链方面的论文,希望可以对选择区块链毕业设计的同学们有所帮助,这是汇智网编辑整理的区块链毕业设计论文系列中的第7篇。 1、IoT区块链共识协议调查 区块链作为加密货币的底层技术所取得的成功也为器再其他应用领域开启了可能性。区块链的主要优点就在于其固有的安全机制以及数据不变特性。区块链依赖于共识方法实现对任何新数据添加的共识。目前在加密货币区块链中使用的大多数共识方法都要求很大的算力,因此并不适合资源有限的系统。在本文中,我们探讨并调查了可用于资源有限的IoT设备和网络的共识算法。 典型的IoT网络中包含有限计算能力的设备,大多数情况下,这些设备无法执行密集的运算,也不能占用太多的带宽。因此,我们将讨论可以这些共识算法中降低计算能力要求和收敛时间的措施,同时也会讨论公链的一些替代方案,例如私链、tangle以及它们在IoT网络中的应用。更进一步我们重新审视已有的共识方法并探索其在IoT网络中应用的可能性。 论文pdf下载:A Survey on Consensus Protocols in ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7