详解android进行异步更新UI的四种方式

大家都知道由于性能要求,Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正:

  1. 使用Handler消息传递机制;
  2. 使用AsyncTask异步任务;
  3. 使用runOnUiThread(action)方法;
  4. 使用Handler的post(Runnabel r)方法;

下面分别使用四种方式来更新一个TextView。

1.使用Handler消息传递机制

package com.example.runonuithreadtest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class MainActivity extends Activity {

 private TextView tv;

 Handler handler = new Handler()
 {
  public void handleMessage(android.os.Message msg) {
   if(msg.what==0x123)
   {
    tv.setText("更新后的TextView");
   }
  };
 };

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  tv = (TextView) findViewById(R.id.tv);
  new MyThread().start();
 }
 class MyThread extends Thread
 {
  @Override
  public void run() {
   //延迟两秒更新
   try {
    Thread.sleep(2000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   handler.sendEmptyMessage(0x123);
  }
 }
}

2. 使用AsyncTask异步任务

注:更新UI的操作只能在onPostExecute(String result)方法中。

package com.example.runonuithreadtest;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

 private TextView tv;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  tv = (TextView) findViewById(R.id.tv);
  new Yibu().execute();
 }
 class Yibu extends AsyncTask<String, String, String>
 {

  @Override
  protected String doInBackground(String... params) {
   try {
    Thread.sleep(2000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return null;
  }
  @Override
  protected void onPostExecute(String result) {
   // TODO Auto-generated method stub
   tv.setText("更新后的TextView");
  }

 }
}

3. 使用runOnUiThread(action)方法

package com.example.runonuithreadtest;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

 private TextView tv;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  tv = (TextView) findViewById(R.id.tv);
  new MyThread().start();
 }
 class MyThread extends Thread
 {
  @Override
  public void run() {
   runOnUiThread(new Runnable() {

    @Override
    public void run() {
     // TODO Auto-generated method stub
      try {
       //延迟两秒更新
       Thread.sleep(2000);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
      tv.setText("更新后的TextView");
    }
   });
  }
 }
}

4. 使用Handler的post(Runnabel r)方法

package com.example.runonuithreadtest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class MainActivity extends Activity {

 private TextView tv;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  tv = (TextView) findViewById(R.id.tv);
  Handler handler = new Handler();
  handler.post(new Runnable(){
   @Override
   public void run() {
    try {
     //延迟两秒更新
     Thread.sleep(2000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    tv.setText("更新后的TextView");
   }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-05-22

android开发教程之handler异步更新ui

其实文字游戏程序很简单,就是一个view和一个Activity,在利用下handier和postInvalidate()更新UI 调用Handler.post(Runnable r)方法,Runnable运行在UI所在线程,所以可以直接调用View.invalidate() 复制代码 代码如下: packagecom.Test.androidtest; importandroid.app.Activity;importandroid.content.Context;importandroid.g

详解android异步更新UI的几种方法

前言 我们知道在Android开发中不能在非ui线程中更新ui,但是,有的时候我们需要在代码中执行一些诸如访问网络.查询数据库等耗时操作,为了不阻塞ui线程,我们时常会开启一个新的线程(工作线程)来执行这些耗时操作,然后我们可能需要将查询到的数据渲染到ui组件上,那么这个时候我们就需要考虑异步更新ui的问题了. android中有下列几种异步更新ui的解决办法: Activity.runOnUiThread(Runnable) View.post(Runnable) long) View.pos

Android异步更新UI的四种方式

大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,大致有4种方式,下面分别使用四种方式来更新一个TextView. 1.使用Handler消息传递机制 package com.example.runonuithreadtest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView;

Android更新UI的四种方法详解

前言 相信每位Android开发者们都知道更新UI只能在主线程中进行,若是在子线程执行任务后需要更新UI,则需要借助handler跳转到主线程中.以下介绍几种操作UI的方法. 一.使用Handler的handleMessage() Handler的构造 public Handler() { this(null, false); } public Handler(Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { fina

Android 实现定时器的四种方式总结及实现实例

Android中实现定时器的四种方式 第一种方式利用Timer和TimerTask 1.继承关系 java.util.Timer 基本方法 schedule 例如: timer.schedule(task, delay,period); //delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次. schedule方法有三个参数 第一个参数就是TimerTask类型的对象,我们实现TimerTask的run()方法就是要周期执行的一个任务: 第二

Android 在子线程中更新UI的几种方法示例

本文介绍了Android 在子线程中更新UI的几种方法示例,分享给大家,具体如下: 方式一:Handler和Message ① 实例化一个Handler并重写handlerMessage()方法 private Handler handler = newHandler() { public void handleMessage(Message msg) { // 处理消息 super.handleMessage(msg); switch (msg.what) { case 1: button1.

Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)

本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView. 布局main.xml: <?xml version="1.0&qu

android全局监控click事件的四种方式(小结)

本文主要给大家分享如何在全局上去监听 click 点击事件,并做些通用处理或是拦截.使用场景可能就是具体的全局防快速重复点击,或是通用打点分析上报,用户行为监控等.以下将以四种不同的思路和实现方式去监控全局的点击操作,由简单到复杂逐一讲解. 方式一,适配监听接口,预留全局处理接口并作为所有监听器的基类使用 抽象出公共基类监听对象,可预留拦截机制和通用点击处理,简要代码如下: public abstract class CustClickListener implements View.OnCli

Python3实现定时任务的四种方式

最近做一个小程序开发任务,主要负责后台部分开发:根据项目需求,需要实现三个定时任务: 1>定时更新微信token,需要2小时更新一次: 2>商品定时上线: 3>定时检测后台服务是否存活: 使用Python去实现这三个任务,这里需要使用定时相关知识点: Python实现定点与定时任务方式比较多,找到下面四中实现方式,每个方式都有自己应用场景:下面来快速介绍Python中常用的定时任务实现方式: 1>循环+sleep: 2>线程模块中Timer类: 3>schedule模块

Android编程中Activity的四种启动模式

本文实例讲述了Android编程中Activity的四种启动模式.分享给大家供大家参考,具体如下: Activity启动方式有四种,分别是: standard singleTop singleTask singleInstance 可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题. 设置Activity的启动模式,只需要在AndroidManifest.xml里对应的<activity>标签设置android:launchMode属性,例