Handler的一个图片轮播程序

1 Handler是什么?
* Handler:用来更新UI(主线程)的一套机制,也是一套消息处理机制,我们可以发送信息,也可以通过它来处理消息。
* 比如最常见的Activity的生命周期:它的回调方法都是通过Handler机制去发送消息的,根据不同的Message来做相应的分支处理。
2 为什么要使用Handler?
* 因为android在设计的时候就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制就没有办法来跟新UI的信息,就会抛出异常。(不能在一个非UI线程中跟新UI)。
* 一个Handler实例其实绑定了一个关联的thread线程和这个线程的message queue;handler会将message和runnable对象发送到它所关联的message queue中去, 同时它也会执行从message queue中出来的message和runnable。
* 3 handler的四种使用的方法:
* sendMessage
* sendMessageDelayed
* post(Runnable)
* postDelayed(Runnable,long)
*


图片轮播
MainActivity.class

public class MainActivity extends AppCompatActivity {private ImageView imageView;private Handler handler = new Handler();private int Images[] = {R.drawable.imga, R.drawable.imgb, R.drawable.imgc};private int index;//索引,指示照片的位置private MyRunnable myRunnable = new MyRunnable();//创建一个Runnable对象/*** 创建一个Runnable*/class MyRunnable implements Runnable {@Overridepublic void run() {index++;index = index % 3;imageView.setImageResource(Images[index]);//让ImageView设置轮播的图片handler.postDelayed(myRunnable, 1000);//每隔1秒去执行myRunnable方法,不断轮播图片,第一个参数是要执行的Runnable对象}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView) findViewById(R.id.iv_picture);handler.postDelayed(myRunnable, 1000);}
}

4 sendMessage方法

 //需要Handler的Message方法private Handler handler = new Handler() { //重写HandleMessage来接收消息,怎么发送一个消息?要在Created方法里面new 出一个线程在里面发送消息@Overridepublic void handleMessage(Message msg) {textView.setText(" " + msg.arg1+ " --- "+msg.arg2);//更新TextView里面的文字super.handleMessage(msg);}};

在onCreate方法里面创建一个线程:

   new Thread() {@Overridepublic void run() {try {Thread.sleep(2000);//要发送消息,那就要先创建一个MessageMessage message = new Message();message.arg1 =88;message.arg2 =888;handler.sendMessage(message);//调用Handler的sendMessage方法来发送消息给handleMessage来处理消息} catch (InterruptedException e) {e.printStackTrace();}super.run();}}.start();//不要忘记调用start方法,否者线程里面的run方法不会执行

调用Message的obj方法来发送比较多的数据,来发送Message的数据载体:
现在内部创建一个Person类:

 //创建一个Person类class Person {public int age;public String name;//调用toString方法输出name 和age@Overridepublic String toString() {return "name=" + name + "age=" + age;}}

然后在线程里面new一个Person对象:

 new Thread() {@Overridepublic void run() {try {Thread.sleep(2000);//要发送消息,那就要先创建一个MessageMessage message = new Message();Person person = new Person();person.age = 22;person.name = "xiaoxjxoaxm";message.obj = person;//调用Message的obi方法来接收person的信息handler.sendMessage(message);//调用Handler的sendMessage方法来发送消息给handleMessage来处理消息} catch (InterruptedException e) {e.printStackTrace();}super.run();}}.start();

更新TextView里面的数据:

 private Handler handler = new Handler() {//重写HandleMessage来接收消息,怎么发送一个消息?要在Created方法里面new 出一个线程在里面发送消息@Overridepublic void handleMessage(Message msg) {textView.setText(" " + msg.obj);//更新TextView里面的文字super.handleMessage(msg);}};

有时候不要创建一个Message对象,直接调用系统的Message的obtainMessage()方法

 new Thread() {@Overridepublic void run() {try {Thread.sleep(2000);//有时候不必创建一个Message对象,而是调用系统的Message对象Message message=handler.obtainMessage();//获取Message对象Person person = new Person();person.age = 22;person.name = "xiaoxjxoaxm";message.obj = person;//调用Message的obi方法来接收person的信息handler.sendMessage(message);//调用Handler的sendMessage方法来发送消息给handleMessage来处理消息} catch (InterruptedException e) {e.printStackTrace();}super.run();}}.start();

有时候不调用 handler.sendMessage(message)来发送消息,还可以调用 message.sendToTarget()来发送消息。target就是一个Handler,它其实就是调用sendMessage来发送消息。

handler.removeCallbacks();//里面传入一个Runnable对象,来移除消息

new Handler(Callback )的时候里面的那个回调方法的作用就是,方便handler内部信息的拦截(当这个消息符合我们的拦截的对象),当callback的handlerMessage方法的返回值为true的时候,handler本身的那个handlerMessage方法将得不到回调的信息,所以第二个handlerMessage方法并不会执行。如果那个返回值为false的话,第二个方法就会得到执行。

  private Handler handler=new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {Toast.makeText(getApplicationContext(),""+2,Toast.LENGTH_SHORT).show();return false;}}){@Overridepublic void handleMessage(Message msg) {Toast.makeText(getApplicationContext(),""+1,Toast.LENGTH_SHORT).show();}};

转载于:https://www.cnblogs.com/linewman/p/9918401.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue或js解析文件excel表格js通过插件解析表格读取文件

安装插件 cnpm i xlsx --save-dev cnpm i jquery --save-dev 引入插件 html引入文件 <input type"file" id"excel-file" value"file"/> dom加载完成解析文件 mounted() {$(#excel-file).change(function(e) {var files e.target.fi…

微信小程序request请求封装;微信小程序封装request请求;uni-app小程序封装request请求;

本片封装了微信小程序request请求&#xff1b;为别是post get put请求&#xff0c;重点在request.js文件 1.新增四个文件 2.根目录下的utils下的request.js封装uni.request()请求 2.1 manifest.json&#xff1a;解决H5浏览器跨域问题-----配置代理一定要重启项目 // 自定义配…

给std::string增加format函数

From: http://www.0xcode.cn/jishu/biancheng/5.html #ifndef lstring#ifdef _UNICODE#define lstring std::wstring#define lchar wchar_t#else#define lstring std::string#define lchar char#endif // _UNICODE#endif // lstring //// 函数名称: string_format// 函数说明…

《C语言深度剖析》学习笔记三

第三章 预处理 注释先于预处理指令被处理&#xff0c;所以无法用宏定义注释宏定义表达式时&#xff0c;每个参数都加括号&#xff0c;避免不必要的错误宏定义时&#xff1a; SUM (x) 和SUM(x)不同使用时&#xff1a; SUM(x) 和SUM (x)一样#define X 3#define Y X*2#undef X#def…

关“视觉神经系统是怎么形成的?”的思考

http://www.cnblogs.com/mrxsc/p/5571358.html 视觉信息的处理是一个非常复杂的过程&#xff0c;这不由得让我想到了同样位于人们大脑中的新大脑皮层&#xff0c;作为人类智能的起始之地&#xff0c;它的运作也不简单&#xff0c;但是在婴儿时期&#xff0c;它的各部分单元并没…

linux 打包解压

第一条打包 第二天解压 zip -r -q -o demo.zip ./demo/unzip -d demo ./demo

uni-app控制小程序版本更新;小程序自动更新版本;uni-app发布新版本后仍旧是老版本问题

问题&#xff1a; 首先小程序&#xff0c;更新版本发布后&#xff0c;用户的版本一般情况下仍是旧版本&#xff1b;需要手动删除小程序后&#xff0c;在重新搜索打开才能使用新版本&#xff1b; 原因查看&#xff1a; 运营机制&#xff1b;更新机制&#xff1b; 解决办法&…

浅尝boost之format

From: http://www.cnblogs.com/WuErPIng/archive/2005/04/21/142308.html 概述 std::string是个很不错的东东&#xff0c;但实际使用时基本在每个程序里都会遇到不愉快的事情&#xff1a;格式化字符串。我甚至由于这个原因在代码里引入平台有关的MFC&#xff0c;ATL等本…

nuxt 服务器构建因太耗CPU进程被杀解决办法

在本地打包然后上传到github 再下载到服务器 如果你项目中有.gitignore那把里面的.nuxt删了(.gitignore是设置GIT不上传的文件)并把dist改为/dist 然后用git或者sourcetree上传项目到github&#xff0c;我这里用的sourceTree 上传完成 到服务器把项目下载下来 我这用的linu…

实用的rpm网站

http://www.rpmfind.net和 http://rpm.pbone.net/转载于:https://blog.51cto.com/nickcoco/993222

在VisualStadio2015上使用EF6.0建立MySql数据库

1.新建工程 2.建立类的文件夹DAL 3.建立相关类 【Student类】 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ETTest3{ public class Student { public int Id { get; set; } public string La…

固定列表的表格

固定的行&#xff1a;行名称不一样&#xff0c;每一个值对应赋值 html&#xff1a; <el-table class"table-box" :data"allObj.peoArr"><el-table-column prop"name" min-width"130"></el-table-column><el-ta…

拼图算法分析...

From: http://blog.sina.com.cn/s/blog_6a4b57e30100mfch.html 一、题目说明&#xff1a;   &#xff08;九宫问题&#xff09;在一个&#xff13;&#xff13;的九宫中有&#xff11;&#xff0d;&#xff18;这&#xff18;个数及一个空格随机的摆放在其中的格子里&#…

uni-app小程序本地打包超过2M不能预览问题;小程序打包过大不能预览和真机调试;uni-app分包;

一、问题&#xff1a;我们在小程序工具中开发时候&#xff0c;需要本地打包&#xff0c;但是当本地的打包文件大于2M时候&#xff0c;预览的二维码就会有问题&#xff0c;导致真机扫码打不开或者有遗漏。 二、此时就需要开启分包 1.微信小程序每个分包的大小是2M&#xff0c;总…

MySQL从5.5升级到5.6,TIMESTAMP的变化

转载来自http://blog.csdn.net/ghsau。 MySQL从5.5升级到5.6&#xff0c;TIMESTAMP的变化 TIMESTAMP在MySQL5.5中的行为 第一个未设置默认值的TIMESTAMP NOT NULL字段隐式默认值&#xff1a; CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP后面未设置默认值的TIMESTAMP NOT …

Asp.Net MVC开源CMS - Orchard

最近在学习Asp.Net MVC, 一直是step by step地看官方文档。 想找个成熟的MVC开发的开源系统&#xff0c;系统学习一下MVC, 搜索了一下&#xff0c;惊喜的发现了Orchard. 这个是介绍 2011/01/21号发布的关于Orchard的介绍&#xff0c;说明Orchard还是一个非常新鲜的事物。以后会…

letsencrypt 免费https安装过程linux centos

curl https://get.acme.sh | sh ~/.acme.sh/ 再修改conf的配置 /home/nginx-1.12.1/conf 目录里的nginx.conf server {server_name www.demo.com;location / {rewrite root html/index/;}} 重启 nginx /home/nginx-1.12.1/sbin/nginx -s reload 运行 我用的是nginx…

拼图游戏及其相关算法

From: http://blog.sina.com.cn/s/blog_4ed8b87701011c6x.html 这个问题其实可以简单表述成&#xff0c;3*3的格子装了1至8&#xff0c;8个数字&#xff0c;数字是随机分布于各个格子中&#xff0c;问是否可以利用空格的格子&#xff0c;移动装有数字的格子最终达到某种序列&a…

在移位数组中查找数

题目描述&#xff1a; 一个数组是由一个递减数列左移若干位形成的&#xff0c;比如{4&#xff0c;3&#xff0c;2&#xff0c;1&#xff0c;6&#xff0c;5}是由{6&#xff0c;5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1}左移两位形成的&#xff0c;在这种数组中查…