Android中使用异步线程更新UI视图的几种方法
在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视图的几种方法的更多相关文章
- 子线程更新UI界面的2种方法
一.一般我们都会在子线程完成一些耗时的操作. 1.Android中消息机制: 2.知识点: Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队, ...
- 安卓 异步线程更新Ui
异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...
- [Android学习笔记]子线程更新UI线程方法之Handler
关于此笔记 不讨论: 1.不讨论Handler实现细节 2.不讨论android线程派发细节 讨论: 子线程如何简单的使用Handler更新UI 问题: android开发时,如何在子线程更新UI? ...
- Android开发——实现子线程更新UI
Android中线程按功能分的话,可以分为两个,一个是主线程(UI线程),其他的都是子线程 主线程不能执行那些耗时过长的代码或任务(执行耗时过长的代码会出现应用未响应的提示),所以都是使用子线程来执行 ...
- 在Android中实现service动态更新UI界面
之前曾介绍过Android的UI设计与后台线程交互,据Android API的介绍,service一般是在后台运行的,没有界面的.那么如何实现service动态更新UI界面呢?案例:通过service ...
- Android中动态改变控件的大小的一种方法
在Android中有时候我们需要动态改变控件的大小.有几种办法可以实现 一是在onMeasure中修改尺寸,二是在onLayout中修改位置和尺寸.这个是可以进行位置修改的,onMeasure不行. ...
- android中实现service动态更新UI界面
案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务. 注册BroadcastReceiver 在主程序activity中注册一个Bro ...
- 更新UI界面的四种方法
一.runOnUiThread(new Runnable()): 二.Handler的sendMessage()系列: 三.Handler的post(): 四.View的post():
- Android通过子线程更新UI的几种方式
一般情况下,UI的更新都少不了Handler,首先我们先了解一下Handler机制: Handler消息机制 定义 Message 线程间通信的数据单元,可通过message携带需要的数据创建对象:M ...
随机推荐
- 认识CSS3新增选择器和样式
前端之HTML5,CSS3(二) CSS3新增选择器和样式 CSS3新增选择器 结构伪类选择器 :first-child:选取父元素中的第一个子元素的指定选择器 :last-child:选取父元素中的 ...
- java翻译到mono C#实现系列(2) mono实现GridView 横向滚动
群里的朋友问GridView 横向滚动怎么实现,我就百度了,参考http://blog.csdn.net/lonely_fireworks/article/details/7841134写了个mono ...
- 初始设置ubuntu 16.04 Vps部署rails
参考 https://blog.longwin.com.tw/2005/12/ssh_keygen_no_passwd/ 1 选择搬瓦工左边菜单栏中的“Root password modificati ...
- CPU缓存一致性协议与java中的volatile关键字
有关缓存一致性协议MESI自行百度. 提出问题:volatile在缓存一致性协议上又做了哪些事情?为啥它不保证原子性? 在缓存一致性协议下,CPU为了执行效率使用了写(存储)缓存和失效队列从而导致对用 ...
- jsonp_百度联想
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- Redis 【Hash】 一句话说明
HDEL-----------------------------------------------------------哈希表 key 中的一个或多个指定域 HEXISTS----------- ...
- golang学习之接口型函数
先说下使用接口型函数的好处: 1.不必将某个接口函数附在某个type上面,保证了命名随意 2. 可以直接调用函数或者使用该接口,两两不耽误 直接上代码吧: // interface_func proj ...
- flask笔记三:flask-login插件的使用
flask-login插件的使用 安装: pip install flask-login 初始化LoginManager ##############LoginManager设置########### ...
- g2o error2
./pose_estimation_3d2d: error while loading shared libraries: libg2o_core.so: cannot open shared obj ...
- spring cloud 注册、发现、消费、负载均衡