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秒钟以上 ...
随机推荐
- 在Eclipse中导入web项目时的问题总结
一.导入项目 在Project Explorer右击,import-->Existing Projects into Workspace,选择要导入的文件,Finish. 二.解决报错 (1)T ...
- Vue中观察者模式的实现
Vue中实现观察者模式的方法可以有三种: 1.v-on方法 exp: <div id='test'> <button v-on:event='functionName'>but ...
- python基础 (装饰器,内置函数)
https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...
- jmeter手写脚本,使用正则获取cookie(禁用cookies管理器)
注:这里以bugfree为例 1.bugfree登录时会有重定向,这会导致每个URL都会有.因此要手动获取cookie的时候,需要去掉重定向勾选 正则获取动态PHPsession 获取到值后,放到信息 ...
- elementUI表格排序问题
elementUI表格排序: 问题:得不到排序后的数组,每次打印的总是一开始的数据 <el-table ref="passTable" :data="passTab ...
- U-Mail企业邮箱如何导入授权文件
首先,由于U-Mail有Linux版本与Windows版本的区别,并且都非常简单,所以就有了下面的步骤: Windows版本 <点击快速跳转> Linux版本 <点击快速跳转> ...
- Android学习(三)
学号 20189214 <Android程序开发>第八周学习总结 教材学习内容总结 GridView GridView和ListView一样是AbsListView的子类; 都需要一个Ad ...
- vb编程中的is是什么意思??
在select case 语句中可以使用关系运算符大于>小于<等于=等关系运算符,需要用关键字IS和TO.用个例子来说明:Private Sub Command1_Click()Dim a ...
- 如何在线更新visual studio installer2017
更新最后100M文件需要开启全局代理才能成功,不然需要等2个小时才能成功!墙太深了..
- 根据缺少的so,安装相关的软件
http://blog.csdn.net/dianyueneo/article/details/8161350. ubuntu缺少libGL.so sudo apt-get install apt-f ...