Android精通之Handler讲解
版权声明:未经博主允许不得转载

一:简介
【达叔有道】软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family !
二:重点
那么什么是Handler呢?为什么要使用Handler呢?如何去实现呢?我们要了解Handler的工作原理在学Handler中,我们要知道并学习Handler,Looper,MessageQueue,Message等知识点。
消息循环机制
Handler
1.Looper循环者
2.Message消息
3.MessageQueue消息队列(专门存放消息的)
一:在Handler学习中,主要了解Handler,Looper,MessageQueue,Message,Handler的作用将Message对象发送到MessageQueue中,Looper的作用像个发动机,从MessageQueue中取出数据交给Handler中的handleMessage方法。
Handler的方法以及使用
1.Handler.sendMessage()
2.Handler.post()
二:在onCreate中为主线程/UI线程,做一些轻量级的事情
主线程:
//创建一个Handler
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
/*
* 接到子线程发出来的消息,处理
* */
//处理消息
Log.i(TAG,"handleMessage:" + msg.what);
if (msg.what==110){
textView.setText("huang");
}
}
};
子线程:
/*
* 有可能做大量耗时的操作
* 子线程
* */
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*
* 通知UI更新
* */
handler.sendEmptyMessage(110);
}
}).start();
三: Handler
public class Handler extends Object
导入android.os.Handler
//子类
[AsyncQueryHandler][AsyncQueryHandler.WorkerHandler][HttpAuthHandler][SslErrorHandler]
处理程序:
处理Message与线程关联的Runnable对象MessageQueue,第一,安排将要执行的消息和可执行的程序;二,在不用的线程执行任务。
调度消息和实现
sendMessage(Message msg)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
sendEmptyMessage(int)
post(Runnable)
postAtTime(Runnable,log)
postDelayed(Runnable,Object,log)
//有很多方法还是要查官方文档的好
SystemClock.uptimeMillis()为系统时间,给执行带来额外的延迟
这里了解一下源码里有
obtainMessage(参数)
what:int:要分配给返回的Message.what字段的值。
arg1:int:要分配给返回的Message.arg1字段的值。
arg2:int:要分配给返回的Message.arg2字段的值。
//
发送消息延迟sendMessageAtTime
四://Two
public class MainActivity extends AppCompatActivity {
//主线程
}
在子线程中:
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
* 有可能做大量耗时的操作
* 子线程
* */
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*
* 通知UI更新
* */
Message message = Message.obtain();
message.what=1;
message.arg1=2;
message.arg2=3;
message.obj=MainActivity.this;
handler.sendMessage(message);
//定时任务
handler.sendMessageAtTime(message,SystemClock.uptimeMillis() + 5000);
handler.sendMessageDelayed(message,5000);
//运行可执行对象 消息来做
/*handler.post(new Runnable() {
@Override
public void run() {
执行代码
}
});*/
final Runnable runnable = new Runnable() {
@Override
public void run() {
//执行代码
}
};
handler.post(runnable);
runnable.run();
//定时任务
handler.postDelayed(runnable,5000);
}
}).start();
}
});
五:
在子线程中先调用 Looper.prepare(),然后Handler handler = new Handler();//...//Looper.loop();
了解一下Looper
Looper为线程运行消息循环的类。线程默认情况下没有与它们相关的消息循环;创建一个,在要运行循环的线程中调用prepare(),然后让loop()处理,直到循环停止。
与消息循环的大多数交互是通过Handler类。
class LooperThread extends Thread {
public void run() {
Looper.prepare();
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
}
};
Looper.loop();
}
}
六:强引用与弱引用
什么是强引用和弱引用呢?对象的引用机制,使得程序能够灵活地控制对象的生命周期。
强引用(StrongReference)
强引用可以理解为我们生活中必不可少的东西,如你的手机,当你空间不足时(占用空间),你也不会丢弃它,宁可抛出异常,在Java中最为常见的对象,只要此引用存在并且没有被释放就不会被垃圾回收机制回收,只有当释放了,才可能回收。
弱引用(WeakReference)
弱引用即是生活中可有可无的东西,在Java中如果一个对象具备弱引用,那么不管空间是否足够都会被回收。
//创建一个对象
Person person=new Person();
WeakReference<Person> weakPerson=new WeakReference<Person>(person);
七:防止内存泄漏:
private static class MyHandler extends Handler{
//WeakReference
WeakReference<MainActivity> weakReference;
public MyHandler(MainActivity activity){
weakReference = new WeakReference<MainActivity>(activity);
}
public void handleMessage(Message msg){
super.handleMessage(msg);
if(weakReference.get() != null){
}
}
}
当weakReference.get() != null,表示weakReference指向的对象activity没有被回收。
如果此方法返回为空的话,说明weakReference指向的对象activity已经被回收。
只要指向还指向就不会被回收。
八:例子:
public class OneActivity extends Activity{
private MyHandler mHandler=new MyHandler(this);
public static class MyHandler extends Handler{
public final WeakReference<OneActivity > mWeakReference;
public DiglettHandler(OneActivity activity) {
mWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
OneActivity activity = mWeakReference.get();
}
}
}
九:复习快捷键
Ctrl+n 查找类
Ctrl+Alt+L 格式化代码
Ctrl+d 复制行
Ctrl+y 删除行
编辑 :达叔
定位:分享 Android&Java 知识点
Android精通之Handler讲解的更多相关文章
- android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版
首先原谅我把文章的标题写的这么长.其实我还嫌弃它短了因为 写不下去了所以我就不写了.因为我实在不知道该怎么定义这篇文章的标题或许应该叫 "乱谈"比较合适. 这样可能还体现了 ...
- Android的Handler机制
Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...
- Android 测试Handler的基本使用
package com.sherlock.app_handler; import java.io.ByteArrayOutputStream; import java.io.InputStream; ...
- Android中Handler 、Thread和Runnable之间的关系
在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...
- Android之Handler,举例说明如何更新UI
方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...
- Android之Handler用法总结(1)
方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...
- Android之Handler用法总结
方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...
- android ProgressBar 样式讲解
转载自:eoe社区,可惜没找到源地址... 多式样ProgressBar 普通圆形ProgressBar 该类型进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中. 一 ...
- 【Android】Handler使用入门
本讲内容:Handler使用入门 当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上 ...
随机推荐
- Linux 学习笔记 3:Shell 基础
1.Shell的工作原理 Shell是用户和操作系统之间的接口.当用户登录系统,有一个Shell进程随之启动,并在用户注销时终止.用户输入的命令是Shell输入. 处理命令的步骤:查找命令中的元字符: ...
- JavaScript并发模型与Event Loop (转载)
并发模型可视化描述 model.svg 如上图所示,Javascript执行引擎的主线程运行的时候,产生堆(heap)和栈(stack),程序中代码依次进入栈中等待执行, 若执行时遇到异步方法,该异步 ...
- weblogic安装升级配置
本次操作是主要围绕如何搭建weblogic服务器升级weblogic软件及配置服务,总共有三大步骤,可划分为六个小步骤: 选取已有环境,准备weblogic压缩包,java包等 准备操作系统环境用户目 ...
- Saliency Detection: A Spectral Residual Approach
Saliency Detection: A Spectral Residual Approach 题目:Saliency Detection: A Spectral Residual Approach ...
- Python学习:经典编程例题
九九乘法表 ,): ,i+): print(i,'*',j,'=',i*j,end='\t') print() 水仙花数问题描述:100-999之间每个数的立方相加等于原数例如:153=1 ^ 3 + ...
- python中打印一个字符串中有多少个单词
1.for实现: str1 = str.strip(input("please input a str:"))n = 1i = 0for i in range(len(str1)- ...
- SpringBoot跨域问题
1.先来说说跨域原理: 跨域原理简单来说就是发起跨域请求的时候,浏览器会对请求域返回的响应信息检查HTTP头,如果Access-Control-Allow-Origin包含了自身域,则允许访问,否则报 ...
- dotnet 在build restore publish 的时候不显示警告
dotnet restore -nowarn:msb3202,nu1503,cs1591 dotnet build -nowarn:msb3202,nu1503,cs1591 --no-restore ...
- 分离式lnmp部署
分离式lnmp简介 lnmp和lamp一样,是一种常用的web环境, 在实际环境中,lnmp中的三个服务常常为了更好的性能而分在三台主机上安装. 本篇内只介绍nginx和php-fpm+mysql分离 ...
- 重置表单中的文件上传控件(file input)的方法
方法一: 调用所在 form 表单的 reset 方法,这个方法的缺点是会把整个表单重置,需要存储表单的状态,再回填回去 方法二: 使用jQuery,代码为: $("#id").r ...