Android子线程中更新UI的4种方法
方法一:用Handler
1、主线程中定义Handler:
Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //完成主界面更新,拿到数据 String data = (String)msg.obj; updateWeather(); textView.setText(data); break; default: break; } } };
2、子线程发消息,通知Handler完成UI更新:
private void updateWeather() { new Thread(new Runnable(){ @Override public void run() { //耗时操作,完成之后发送消息给Handler,完成UI更新; mHandler.sendEmptyMessage(0); //需要数据传递,用下面方法; Message msg =new Message(); msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等; mHandler.sendMessage(msg); } }).start(); }
方法一的Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用;
方法二:用Activity对象的runOnUiThread方法更新
在子线程中通过runOnUiThread()方法更新UI:
new Thread() { public void run() { //这儿是耗时操作,完成之后更新UI; runOnUiThread(new Runnable(){@Override public void run() { //更新UI imageView.setImageBitmap(bitmap); } }); } }.start();
如果在非上下文类中(Activity),可以通过传递上下文实现调用;
Activity activity = (Activity) imageView.getContext(); activity.runOnUiThread(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap); } });
这种方法使用比较灵活,但如果Thread定义在其他地方,需要传递Activity对象;
方法三:View.post(Runnable r)
imageView.post(new Runnable(){ @Override public void run() { imageView.setImageBitmap(bitmap); } });
这种方法更简单,但需要传递要更新的View过去;
方法四:AsyncTask
//UI线程中执行 new DownloadImageTask().execute( "www.91dota.com" ); private class DownloadImageTask extends AsyncTask { protected String doInBackground( String... url ) { return loadDataFormNetwork( url[0] );//后台耗时操作 } protected void onPostExecute( String result ) { myText.setText( result ); //得到来自网络的信息刷新页面 } }
总结:
1、其实上面的四种方式都可归结于一种方式:handler 用于Android线程之间的通信。
2、为什么android要求只能在UI线程进行UI操作? 主要还是为了避免多线程造成的并发的问题。在单线程操作UI是安全的。
转载于:https://www.cnblogs.com/DreamRecorder/p/9138260.html
Android子线程中更新UI的4种方法相关推荐
- android 不能在子线程中更新ui的讨论和分析
问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...
- 为什么不能在子线程中更新UI
首先声明一点:子线程里面是可以更新UI的--创建一个空白的Activity,在其xml文件中放一个空白TextView,Java代码如下: @Override protected void onCre ...
- C#子线程中更新ui
本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的 ...
- 子线程中更新UI线程的三个方法
1.通过handler方式,sendmessage. 多个类间传递比较麻烦,也懒的写... 2.线程中通过runOnUiThread() new Thread() { public void run( ...
- android-如何在子线程中更新ui
参考:https://blog.csdn.net/u013356254/article/details/52287794 实现基本跟链接相同,不同只出在于WindowManager.LayoutPar ...
- 【源码】让源码告诉你:为什么在子线程无法更新 UI 操作?
博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/ ...
- android 线程 界面,android开发教程之子线程中更新界面
每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间 ...
- Android中Handler的使用方法——在子线程中更新界面
本文主要介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Ha ...
- Android利用Looper在子线程中改变UI
MainActivity如下: package cn.testlooper; import android.app.Activity; import android.os.Bundle; import ...
最新文章
- “雾霾”天里坐看云起时-【软件和信息服务】2014.01
- 重载(Overload )和覆写(override)的理解及区别
- bootstrap layui 两种分页的实现
- Win64 驱动内核编程-32.枚举与删除注册表回调
- Math,random()返回区间内的随机数
- Java中Properties类的学习总结
- 一篇关于蓝牙SDP和L2CAP协议的文章
- python : 读取csv最快的Datatable的用法
- 技术图文:如何利用C#寻找免费的IP代理服务器?
- JavaScript之切换背景图片(并使)背景栏保持和背景色调相似
- VO、DTO、DO、PO
- 利用爬虫获取免费IP代理
- 微服务分布式构架开发实战PDF,阿里架构师推荐,快快收藏吧
- python手机编程软件-盘点几个在手机上可以用来学习编程的软件
- Win10 平台下, LightGBM GPU 版本的安装
- python高手之路_python高手之路python处理ex
- 财务舞弊(本福特——KS验证)
- IBM 发布全球首个 2nm 芯片制造技术
- 如何看待:Oracle Java SE 8 发行版更新 ? --- 变向激励学习 JDK 10 吗?
- 软件测试工程师好就业吗?软件测试工程师发展空间怎么样?