在Android中子线程是不能更新ui的。

所以我们要通过其他方式来动态改变ui视图,

1、runOnUiThread
activity提供的一个轻量级更新ui的方法,在Fragment需要使用的时候要用getActivity.runOnUiThread开启线程
这种方法最简单,方便更新一些不需要判断的通知,比如在聊天项目中动态获取未读消息数量。

runOnUiThread(new Runnable() {
@Override
public void run() {
sendMessage("[自动回复]你好,我是机器人"); } });

2、Handler message

使用这个方法可以设置比如按钮倒计时的控制,也是比较常见的一种更新ui的方法。

创建一个主线程用于接收子线程不断发送的消息,通过msg.what判断传递的消息类型。 
根据类型进行相关ui的更新操作。

创建线程用于接收:

 private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case :
setResult(RESULT_OK);
TimerButtonActivity.this.finish();
break;
case :
mTimer1.setEnabled(false);
mTimer1.setText("已发送(" + String.valueOf(time) + ")");
break;
case :
mTimer1.setEnabled(true);
mTimer1.setText("重新获取验证码");
time = ;
break;
} }
};

发送消息的方法:

mHandler.sendEmptyMessage();

3、Handler Runnable

同样也是需要先创建一个线程。

 Handler handler = new Handler();

在一开始加载的地方使用postDelayed设置加载延迟

 handler.postDelayed(new Runnable() {
@Override
public void run() {
updataData();
}
}, );

或者我们要进行一个自动刷新的动作,当动作完成时,隐藏刷新效果

//开启一个刷新的线程
mFragmentMainRf.post(new Runnable() {
@Override
public void run() {
//开始
mFragmentMainRf.setRefreshing(true);
}
});
//监听刷新状态操作
mFragmentMainRf.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//设置延迟刷新时间1500
handler.postDelayed(new Runnable() {
@Override
public void run() {
//刷新数据
updataData();
}
}, );
}
});

4、AsyncTask
AsyncTask可以更加轻松地使用UI线程。该类允许执行后台操作并在UI线程上更新视图,而不需要操纵线程和处理程序。
AsyncTask被设计为一个辅助类Thread,Handler 并且不构成通用线程框架。用于短时间更新操作。
在使用的时候需要继承AsyncTask并重写方法:
doInBackground:用于返回结果
onProgressUpdate: onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作
onPostExecute:接收doInBackground的返回结果,用于更新UI

  class AsyncTaskWrapper extends AsyncTask<Void, Integer, Object>{

        @Override
protected Object doInBackground(Void... voids) {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
} @Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.e("Progress",valuse);
} @Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Log.e("Message",o);
}
}

Android中使用异步线程更新UI视图的几种方法的更多相关文章

  1. 子线程更新UI界面的2种方法

    一.一般我们都会在子线程完成一些耗时的操作. 1.Android中消息机制: 2.知识点: Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队, ...

  2. 安卓 异步线程更新Ui

    异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...

  3. [Android学习笔记]子线程更新UI线程方法之Handler

    关于此笔记 不讨论: 1.不讨论Handler实现细节 2.不讨论android线程派发细节 讨论: 子线程如何简单的使用Handler更新UI 问题: android开发时,如何在子线程更新UI? ...

  4. Android开发——实现子线程更新UI

    Android中线程按功能分的话,可以分为两个,一个是主线程(UI线程),其他的都是子线程 主线程不能执行那些耗时过长的代码或任务(执行耗时过长的代码会出现应用未响应的提示),所以都是使用子线程来执行 ...

  5. 在Android中实现service动态更新UI界面

    之前曾介绍过Android的UI设计与后台线程交互,据Android API的介绍,service一般是在后台运行的,没有界面的.那么如何实现service动态更新UI界面呢?案例:通过service ...

  6. Android中动态改变控件的大小的一种方法

    在Android中有时候我们需要动态改变控件的大小.有几种办法可以实现  一是在onMeasure中修改尺寸,二是在onLayout中修改位置和尺寸.这个是可以进行位置修改的,onMeasure不行. ...

  7. android中实现service动态更新UI界面

    案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务. 注册BroadcastReceiver 在主程序activity中注册一个Bro ...

  8. 更新UI界面的四种方法

    一.runOnUiThread(new Runnable()): 二.Handler的sendMessage()系列: 三.Handler的post(): 四.View的post():

  9. Android通过子线程更新UI的几种方式

    一般情况下,UI的更新都少不了Handler,首先我们先了解一下Handler机制: Handler消息机制 定义 Message 线程间通信的数据单元,可通过message携带需要的数据创建对象:M ...

随机推荐

  1. 10. JavaScript学习笔记——JSON

    10. JSON ///[JSON是一种数据格式,不是JS 独有的] ///[JSON语法] /* 1.数据书写格式:"name":value,JSON要求给属性名加上[双引号], ...

  2. GeneXus学习笔记——创建一个知识库 哈哈哈哈!

    终于想到写什么东西了(绝对不是因为懒 好吧 信我)  那么进入正题 我们写项目的时候 遇到一些问题啥的 总会听到大佬说:“这有什么难的 说到底不就是简单的增删改查么"  然后我们就会露出 Σ ...

  3. Linux - iptables firewalld

    目录 iptables firewalld iptables 1.iptables 的基本使用 启动: service start iptabls 关闭: service stopiptabls 查看 ...

  4. 在MVC程序中使用MongoDB数据库

    .net项目中混搭数据库 安装和部署 C#中使用MongoDB MongoDb与关系型数据库区别 开机自启动 关系型数据库和非关系型数据口可以混搭 MongoDB是一个高性能,开源,无模式的,基于分布 ...

  5. jQuery Mobile 实现苹果滑动删除闹钟功能的几点总结

    1.jquery给动态添加的元素添加事件 在jquery推出新版本,使用.on()以前,我们会用.live()来为动态添加的代码绑定事件,但是现在jQuery用.on()替代了.live() 先看个. ...

  6. 关于禁止html缓存

    在现代的浏览器里,为了增强用户体验,浏览器一般都会把网页上所需的静态文件缓存到本地,再次刷新的时候则无需再重新加载,但是我们有时候就是不需要浏览器缓存这些文件,而是每次都从服务器端读取数据,可以用以下 ...

  7. Python DataFrame导出CSV、数据库

    写入Oracle from sqlalchemy import create_engine import pandas as pd import numpy as np df = pd.DataFra ...

  8. Sumblime Text 2/3 插件安装方法

    使用Package Control组件安装 按Ctrl+`调出console(注:安装有QQ输入法的这个快捷键会有冲突的,输入法属性设置-输入法管理-取消热键切换至QQ拼音): 如果是sublime ...

  9. maven 错误:读取 xxx.jar 时出错;invalid LOC header (bad signature) 1 错误

    reqHeader:{Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, Upgrade-Insecure- ...

  10. OpenTLD在VS2012和opencv246编译通过

    最近看到了TLD的跟踪视频,觉得很有意思,刚好最近在看行人检测所以就打算下载源码玩一玩,因为源码是Linux版本的(原作者写的是C++和MATLAB的混合编程)C++源码可以在我的博客TLD(一种目标 ...