方法一:用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种方法相关推荐

  1. android 不能在子线程中更新ui的讨论和分析

    问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...

  2. 为什么不能在子线程中更新UI

    首先声明一点:子线程里面是可以更新UI的--创建一个空白的Activity,在其xml文件中放一个空白TextView,Java代码如下: @Override protected void onCre ...

  3. C#子线程中更新ui

    本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的 ...

  4. 子线程中更新UI线程的三个方法

    1.通过handler方式,sendmessage. 多个类间传递比较麻烦,也懒的写... 2.线程中通过runOnUiThread() new Thread() { public void run( ...

  5. android-如何在子线程中更新ui

    参考:https://blog.csdn.net/u013356254/article/details/52287794 实现基本跟链接相同,不同只出在于WindowManager.LayoutPar ...

  6. 【源码】让源码告诉你:为什么在子线程无法更新 UI 操作?

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  7. android 线程 界面,android开发教程之子线程中更新界面

    每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间 ...

  8. Android中Handler的使用方法——在子线程中更新界面

    本文主要介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Ha ...

  9. Android利用Looper在子线程中改变UI

    MainActivity如下: package cn.testlooper; import android.app.Activity; import android.os.Bundle; import ...

最新文章

  1. “雾霾”天里坐看云起时-【软件和信息服务】2014.01
  2. 重载(Overload )和覆写(override)的理解及区别
  3. bootstrap layui 两种分页的实现
  4. Win64 驱动内核编程-32.枚举与删除注册表回调
  5. Math,random()返回区间内的随机数
  6. Java中Properties类的学习总结
  7. 一篇关于蓝牙SDP和L2CAP协议的文章
  8. python : 读取csv最快的Datatable的用法
  9. 技术图文:如何利用C#寻找免费的IP代理服务器?
  10. JavaScript之切换背景图片(并使)背景栏保持和背景色调相似
  11. VO、DTO、DO、PO
  12. 利用爬虫获取免费IP代理
  13. 微服务分布式构架开发实战PDF,阿里架构师推荐,快快收藏吧
  14. python手机编程软件-盘点几个在手机上可以用来学习编程的软件
  15. Win10 平台下, LightGBM GPU 版本的安装
  16. python高手之路_python高手之路python处理ex
  17. 财务舞弊(本福特——KS验证)
  18. IBM 发布全球首个 2nm 芯片制造技术
  19. 如何看待:Oracle Java SE 8 发行版更新 ? --- 变向激励学习 JDK 10 吗?
  20. 软件测试工程师好就业吗?软件测试工程师发展空间怎么样?

热门文章

  1. 珍藏的最全的windows操作系统快捷键
  2. 利用commons-fileupload 上传图片(包含表单数据)
  3. document.getElementsByTagName()方法的返回值
  4. 汇编语言--mul 指令
  5. linux常用命令,知识在于总结
  6. STM32系统滴答定时器(systick)应用
  7. STM32中3个延时函数
  8. eclipse如何导出WAR包
  9. 二值信号量和互斥锁到底有什么区别?
  10. spring26-2: bean的作用域