在android里面,我们经常要上网获取一些数据,然后更新UI,但获取数据是要时间的,如果在主线程里面直接使用获取数据的代码的话。整个activity就会卡在那,直至你获取到数据更新完UI才会加载完成。在android里面,如果一个activity卡了5秒,就会被强制回收掉。

  回想一下我们用过的App,遇到要加载的时候,一般是怎么样的呢?肯定不会是让界面卡死在那里的,最不济的也有一个"加载中"的圈圈在那转吧!然后数据加载出来后就消失。

  然而android有个很微妙的机制,更新UI只能在UI线程,就是在我们的主线程,而访问网络只能在其他线程,要怎么办呢?答案就是使用Handler类。

  主要的思路是这个样子的:

  1、让程序一开始就有一个“加载中”的圈圈(Dialog)。

  2、Handler是在主线程实例化的,属于主线程。

  3、在主线程开启另一个线程,用来访问网络加载数据,加载完后,发消息给Handler类。

  4、Handler收到消息后,更新UI,再取消那个"加载中"的圈圈。

  假设一种情况:要访问网络,找到一段句子,然后更新我们的TextView

  

  private Handler handler;//声明Hanler

  private TextViwe tv;//声明TextView

  

  
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first_page);  //在主线程中实例化Handler  
  handler = new Handler(){ @Override
  //收到消息时该做的事情
public void handleMessage(Message msg) {
super.handleMessage(msg);     //更新TextView UI     
    //取消掉"加载中"的框框
dialog.cancel(); }
}; //创建一个窗口来等待加载
dialog = new ProgressDialog(this);
dialog.setMessage("数据初始化中...");
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
dialog.show(); //开启新的线程来访问网络,获取数据
new Thread(new Runnable() {
@Override
public void run() {     //访问网络     //给Handler发消息
Message ok = new Message();
handler.sendMessage(ok); }
}).start(); }//end onCreate   

  简述一下activity运行的顺序: 一开始打开App时,activity会把所有的声明啊,实例化啊,布局啊什么的都弄好。而后就进入到dialog.show();这个地方,然后整个界面就是一个圈圈在转啊转啊。同时,开启了一个线程去访问网络。即时一个线程在转啊转圈圈(Dialog),另一个线程去访问了网络,获取数据,互不干扰。等到获取完数据后,会实例化一个Message类,给Handler发信息。Handler接收到信息后,更新UI,然后dialog.cancel();取消掉圈圈。然后我们看到的就是更新好的界面了。

  以上只是,简洁化的代码和口头的语言,应该还比较易懂。

 

  

使用Handler类来更新UI的更多相关文章

  1. Android开发学习之路-使用Handler和Message更新UI

    在Android中,在非主线程中更新UI控件是不安全的,app在运行时会直接Crash,所以当我们需要在非主线程中更新UI控件,那么就需要用到Handler和Message来实现 Demo中,使用到一 ...

  2. 关于runOnUiThread()与Handler两种更新UI的方法

    在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot ...

  3. 记录一下关于在工具类中更新UI使用RunOnUiThread犯的极其愚蠢的错误

    由于Android中不能在子线程中更新ui,所以平时在子线程中需要更新ui时可以使用Android提供的RunOnUiThread接口,但是最近在写联网工具类的时候,有时候会出现联网异常,这个时候为了 ...

  4. 【收藏】Android更新UI的几种常见方法

    ----------------将会调用onDraw()重绘控件---------------- 1.view.invalidate刷新UI(主线程)   2.view.postInvalidate刷 ...

  5. android四种更新UI的方法

    笔记: // 使用handler.post(Runnable)更新UI public void updateUI_Fun1() { new Thread() { public void run() { ...

  6. android 子线程更新UI

    参考http://examples.javacodegeeks.com/android/core/os/handler/android-handler-example/package com.exam ...

  7. 四种更新UI的方法

    笔记:   // 使用handler.post(Runnable)更新UI public void updateUI_Fun1() { new Thread() { public void run() ...

  8. 学习通过Thread+Handler实现非UI线程更新UI组件

    [Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...

  9. Android子线程更新UI主线程方法之Handler

    背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. ...

随机推荐

  1. [转载]java向word模板中填充数据(总结)

    使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...

  2. 【scala】迭代器

    如何访问集合呢?我们首先想到的是使用for循环来访问,还有一种方法是通过迭代器来访问. 在Scala中,迭代器(Iterator)不是一个集合,但是,提供了访问集合的一种方法. 迭代器包含两个基本的操 ...

  3. UI- UIView控件知识点回顾

    //  通过一个frame来初始化一个UI控件 - (id)initWithFrame:(CGRect)frame; // YES:能够跟用户进行交互 @property(nonatomic,gett ...

  4. Android process 的启动流程

    Android process 的启动流程 1.android启动时所运行的进程: USER    PID     PPID    VSIZE    RSS    WCHAN         PC   ...

  5. php 中 用curl 发送 https 请求

    在 php.ini 中修改配置选项 curl.cainfo = "D:\phpStudy\php\php-5.6.27-nts\pert\cacert.pem" 其中 cacert ...

  6. python学习之模块&包的引用

    名词解释: 模块:一个程序文件 包:相当于一个类库,打包发布后相当于c#中的dll, 包中可包括若干个模块,比如main.py就是一个模块,对于test2文件下的所有模块组成一个包 对于一个包而言,注 ...

  7. python之Beautiful Soup库

    1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...

  8. RESTful 服务示例

    WCF服务轻量级服务,可供JS调用 返回值格式:XML.Json 工程结构: 示例代码: using System; using System.Collections.Generic; using S ...

  9. 【BZOJ2850】巧克力王国 KDtree

    [BZOJ2850]巧克力王国 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜 欢过于甜的巧克力.对于每一块巧克力,我们设 ...

  10. LOJ10034 图书管理

    题意 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. 该系统需要支 ...