随感一:android handler传值更改ui
handler+looper传值更改activity的UI
博客开了一段时间,一直想写点自己的学习经验及体会,等着以后长时间不用再要用到的时候直接拿过来上手。想了想,之前用到handler,
看了几篇文章感觉不是很详细。今天就来讲讲handler。
android用handler传值更改UI有两个目的:一、从用户体验方面考虑,把繁杂的操作和计算过程放到其他线程,是主线程(用户界面)更
加的流畅,减少出现卡顿现象。
二、确保线程安全,只有主线程能更改UI;
利用handler传值,需要创建looper对象(系统在创建主线程(activity)的时候,在activity内部封装了一个looper对象,即看不到新建
looper对象),系统会为每个looper创建an一个消息队(messagequene),通过handler的sendmessage方法发送消息给该looper的消息
队列,然后在该线程中,handler会从消息队列中取出message,通过message.what来判断接收的message进行什么操作(更改该线程的ui等)。
如果你想在其他的线程里面进行操作之后发message给UI线程改变UI,就必须要确保你的handler发送的消息必须发送到该UI线程的消息队列(messagequene),
最简单的办法就是使用UI线程的handler进行发送message(即sendmessage),下面说两种方法使操作的线程获得UI线程的handler:
一、在操作线程中:Handler handler=MainActivity.handler;如果你要更改UI,就要在MainActivity里面
定义一个handler属性并且要是静态的(static),这样把handler的实例化最好放在oncreact方法里面
(当然,handler实例化可以放在类里面的任何地方),在handler的实例化对象里面重写 handleMessage(Message msg)
方法,在handleMessage方法里面进行接收消息并进行操作改变UI。
二、定义一个有handler属性的类,在类里面添加get和set方法用来获取和实例化handler;
下面看代码吧:
UI线程
public class MainActivity extends DroidGap { public static Handler handler; @Override
public void onCreate(Bundle savedInstanceState) {
// Be sure to call the super class.
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler() { @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 100) {
//这里面写代码更改UI
} else if (msg.what == 101) {
//这里面写代码更改UI
} else if (msg.what == 102) { } }
操作类:
public boolean add(JSONArray json) {
try {
JSONArray jsonArray=json.getJSONArray(0);
JSONObject jsonObject= (JSONObject) (jsonArray.get(0));
final PrintItem printItem=new PrintItem(jsonObject.getString("product"),jsonObject.getInt("count"),jsonObject.getInt("price"));
list.add(printItem);
handler=MainActivity.handler;
Message message=new Message();
message.what=100;
message.obj=printItem;
handler.sendMessage(message);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
随感一:android handler传值更改ui的更多相关文章
- Android handler Thread 修改UI Demo
/********************************************************************** * Android handler Thread 修改U ...
- Android Handler传值方式
前面介绍handler的时候,也用到过几种传值方式,今天来总结一下,并且重点说一下bundle方式,代码如下: package com.handlerThread; import android.ap ...
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...
- Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面
目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...
- android Handler介绍
Handler使用介绍: Handler根据接收的消息,处理UI更新.Thread线程发出消息,通知Handler更新UI. Handler mHandler = new Handler() { p ...
- Activity调用静态方法改变UI,使用Handler来改变UI显示
本人菜鸟,请各位多多指点,不足之处,请斧正.没啥技术含量,就权当丰富下mono for android的小代码. Activity调用静态方法改变UI using System; using Andr ...
- Android Handler的使用示例:结合源码理解Android Handler机制(一)
什么是Handler? Android 的官方解释: 文档分节1:A Handler allows you to send and process Message and Runnable objec ...
- 学习通过Thread+Handler实现非UI线程更新UI组件
[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...
- [Android]Handler的消息机制
最经面试中,技术面试中有一个是Handler的消息机制,细细想想,我经常用到的Handler无非是在主线程(或者说Activity)新建一个Handler对象,另外一个Thread是异步加载数据,同时 ...
随机推荐
- swiper横向轮播(兼容IE8)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- ajax中使用post传值数组array
如果我们在data中想放入array的参数,根据在网上搜索的结果有如下方法,但是没有一个成功的……我还是贴出来,别人成功了,也许是我哪里不对,日后也许还有机会研究..在文章的最后贴出了转化为json的 ...
- (转)px、em、rem的区别和使用
国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem(国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位),那么三者有什么区别,又各自有什么优劣呢? 一.px特点 1. IE ...
- Migrating an ASP.NET MVC application to ADFS authentication
I recently built an ASP.NET application at work to help track internal use of our products. It's bee ...
- jquery mobile 实现自定义confirm确认框效果
类似删除的效果,在执行之前,一般需要添加确认对话框,点确认的话执行,取消按钮就不执行,传统的js if(confirm('确定删除吗?')) { //执行代码 } 这种效果比较丑,使用jquery m ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- PHP弱类型需要特别注意的问题
下面介绍的问题都已验证, 总结:字符数据比较==不比较类型,会将字符转数据,字符转数字(转换直到遇到一个非数字的字符.即使出现无法转换的字符串,intval()不会报错而是返回0).0e,0x开头的字 ...
- ARM、Intel、MIPS处理器啥区别?看完全懂了
安卓支持三类处理器(CPU):ARM.Intel和MIPS.ARM无疑被使用得最为广泛.Intel因为普及于台式机和服务器而被人们所熟知,然而对移动行业影响力相对较小.MIPS在32位和64位嵌入式领 ...
- 【图像处理】【SEED-VPM】5.uImage的烧写 & NFS烧写文件系统
基于 TFTP 烧写 uImage 当用户对 SEED-VPM6467 下的内核驱动源码进行调整或者添加新的设备驱动后,需要对内核进行重新编译配置,编译生成内核镜像后,可以通过 tftp 下载到 SE ...
- SELECT INTO 和 INSERT INTO区别
(1).SELECT * INTO 新表名 FROM 旧表名 (2).INSERT INTO 新表名(列名1,列名2) SELECT * FROM 旧表名 第一句新表名不存在会自动创建, 第二句需创建 ...