版权声明:未经博主允许不得转载

一:简介

【达叔有道】软件技术人员,时代作者,从 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讲解的更多相关文章

  1. android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版

     首先原谅我把文章的标题写的这么长.其实我还嫌弃它短了因为 写不下去了所以我就不写了.因为我实在不知道该怎么定义这篇文章的标题或许应该叫 "乱谈"比较合适. 这样可能还体现了 ...

  2. Android的Handler机制

    Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...

  3. Android 测试Handler的基本使用

    package com.sherlock.app_handler; import java.io.ByteArrayOutputStream; import java.io.InputStream; ...

  4. Android中Handler 、Thread和Runnable之间的关系

    在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...

  5. Android之Handler,举例说明如何更新UI

    方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...

  6. Android之Handler用法总结(1)

    方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...

  7. Android之Handler用法总结

    方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...

  8. android ProgressBar 样式讲解

    转载自:eoe社区,可惜没找到源地址... 多式样ProgressBar 普通圆形ProgressBar 该类型进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中. 一 ...

  9. 【Android】Handler使用入门

    本讲内容:Handler使用入门 当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上 ...

随机推荐

  1. Linux 学习笔记 3:Shell 基础

    1.Shell的工作原理 Shell是用户和操作系统之间的接口.当用户登录系统,有一个Shell进程随之启动,并在用户注销时终止.用户输入的命令是Shell输入. 处理命令的步骤:查找命令中的元字符: ...

  2. Springmvc中@RequestMapping 属性用法归纳

    简介: @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestM ...

  3. python psycopg2 连接pg 建立连接池

    # -*- coding: utf-8 -*-from psycopg2.pool import ThreadedConnectionPool,SimpleConnectionPool,Persist ...

  4. Program Hyundai i20 Smart Key with VVDI & Xtool X100 Pad2

    How-to: generate and program Hyundai i20 smart key with VVDI Mini Key Tool and XTOOL X100 PAD2. Step ...

  5. python3 调用 Linux 脚本

    网上很多教程,很多都是说的2时代的. 这里把3实验过的命令记录下来 首先,如果只需要执行,或者只需要得到执行的状态可以用 os.system 调用 #!/usr/bin/env python3 pri ...

  6. mysql的orde by 按照指定状态顺序排序

    要求按照以下顺序排序 审核中->审核拒绝->待放款->放款失败->待还款->已结清->已逾期 { id:80, label:'审核中'},{ id:100, lab ...

  7. 如何选择合适的PHP版本

    PHP版本很多,包括32位64位以及线程安全与非线程安全在内的php版本多达几百个,应该如何选择PHP版本呢 PHP32和64的选择和区别 32bit的php的整型数据最大最小正负2GB左右(0x7F ...

  8. 《数学之美》--第一章:文字和语言 vs 数字和信息

    PDF下载 第一章 文字和语言 vs 数字和信息 数字.文字和自然语言一样,都是信息的载体,它们之间原本有着天然的联系.语言和数学的产生都是为了同一个目的-记录和传播信息.但是,直到半个多世纪前香农博 ...

  9. Python基础------列表,元组的调用方法

    Python基础------列表,元组的调用方法@@@ 一. 列表 Python中的列表和歌曲列表类似,也是由一系列的按特定顺序排列的元素组成的,在内容上,可以将整数,实数,字符串,列表,元组等任何类 ...

  10. easyui_validatebox常用验证

    $.extend($.fn.validatebox.defaults.rules, { idcard: {// 验证身份证 validator: function (value) { return / ...