Android handler详解(面试百分之100问到)

handler在Android中被称为“消息处理者”,在多线程中比较常用。

handler内部实现原理



handler实现机制:
1,Message对象,表示要传递的一个消息,内部使用链表数据结构实现一个消息池,用于重复利用,
避免大量创建消息对象,造成内存浪费
2,MessageQueue对象,存放消息对象的消息队列,先进先出原则
3,Looper对象负责管理当前线程的消息队列
4,handler对象负责把消息push到消息队列中,以及接收Looper从消息队列中取出的消息



handler的内存泄露问题(activity已经退出,而handler没有退出,这样就可能导致内存泄露)
1,定义一个内部类时,会默认拥有外部类对象的引用,所以建议使用内部类时,最好定义一个静态内部类
2,引用的强弱:强引用→软引用→弱引用



下面用获取网络图片代码说明一下handler基本使用

package com.example.uri;

import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.MalformedURLException;
import java.net.URL;

import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;

/**
 *
 * 访问网络的操作,必须放在工作线程中完成
 *
 */
public class MainActivity extends Activity {

    private static final int LOADSUCCESS=0x1;
    private static ImageView iv;
    private final myhandler handler=new myhandler(this);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv=(ImageView) findViewById(R.id.imageView1);
    }

    private static class myhandler extends Handler{

        private final WeakReference<MainActivity> weakReference;
        public myhandler(MainActivity mainActivity){
            weakReference=new WeakReference<MainActivity>(mainActivity);
        }

        public void handleMessage(Message msg) {
            MainActivity mainActivity=weakReference.get();
            if(mainActivity!=null){
                switch (msg.what) {
                case LOADSUCCESS:
                    MainActivity.iv.setImageBitmap((Bitmap) msg.obj);
                    break;

                }
            }
        }
    }
    public void geturl(View v){
        /*Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
        startActivity(intent);  */
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    URL url=new URL("http://img2.3lian.com/img2007/10/28/123.jpg");
                    InputStream in=url.openStream();
                    Bitmap bitmap=BitmapFactory.decodeStream(in);
                    Message message= handler.obtainMessage(LOADSUCCESS, bitmap);
                    handler.sendMessage(message);
                } catch (MalformedURLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
        }).start();

    }

}
时间: 2024-10-19 22:50:25

Android handler详解(面试百分之100问到)的相关文章

Android Handler 详解

Android开发中经常使用Handler来实现"跨越线程(Activity)更新UI".本文将从源码角度回答:为什么使用Handler能够跨线程更新UI?为什么跨线程更新UI一定要用Handler? Demo Demo1. 用Handler更新UI 下面这个Demo完全是为了演示"跨线程更新UI"而写的.界面上只有一个TextView和一个Button,按下Button创建一个后台线程,该后台线程每隔一秒更新一次TextView,连续更新10次,结束. Activ

android handle详解2 主线程给子线程发送消息

按照android handler详解分析的原理我们可以知道,在主线程中创建handle对象的时候,主线程默认创建了一个loop对象使用threalocal函数将loop对象和主线程绑定. 我们能不能在子线程中创建一个loop对象和子线程绑定了实际上是可以的 这样我们就在子线程中创建了一个looper对象,将looper对象和子线程绑定了,在子线程中执行Loop.loop()函数的内部是开启了一个死循环对消息队列中的消息进行遍历,所以子线程是永远不会退出的. 当我们在主线程中调用获得subHan

Android 基础总结:( 十四)Handler详解(上)

Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发,比如说,你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作. 如果此时需要一个耗时的操作,例如:联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收

Android 基础总结:( 十五)Handler详解(下)

Android GWES之Android消息系统 Looper,Handler,View 我们要理解Android的消息系统,Looper,Handle,View等概念还是需要从消息系统的基本原理及其构造这个源头开始.从这个源头,我们才能很清楚的看到Android设计者设计消息系统之意图及其设计的技术路线. 1.消息系统的基本原理 从一般的系统设计来讲,一个消息循环系统的建立需要有以下几个要素: 消息队列 发送消息 消息读取 消息分发 消息循环线程 首先来研究一下消息驱动的基本模型,我使用如下的

[Android]Message,MessageQueue,Looper,Handler详解+实例

转http://www.eoeandroid.com/forum-viewthread-tid-49595-highlight-looper.html 一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方.每一个线程最多只可以拥有一个MessageQueue数据结构. 创建一个线程的时候,并不会自动创建其MessageQueue.通常使用一个Looper对象对该线程的MessageQueue进行管理.主线程创建时,会创建一 个默认的Loope

Android ProgressBar详解以及自定义

版本:1.0 日期:2014.5.16 版权:© 2014 kince 转载注明出处 这一次主要说一下Android下的进度条,为什么是它呢,因为近期被其各种美轮美奂的设计所倾倒,计划逐渐去实现.另外一个因素也是它也是为数不多的直接继承于View类的控件,从中可以学习到一些自定义控件的知识.下面列举了一些个人觉得还算漂亮的进度条,仅供参考. 是不是很漂亮,其实就像上面图形展示的那样,进度条大体上无非就是这几种形式.这样一来肯定是需要自定义了,所以方向有两个:要么继承于系统的ProgressBar

android WebView详解,常见漏洞详解和安全源码

这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 由于博客内容长度,这次将分为上下两篇,上篇详解 WebView 的使用,下篇讲述 WebView 的漏洞和坑,以及修复源码的解析. 下篇:android WebView详解,常见漏洞详解和安全源码(下) 转载请注明出处:http://blog.csdn.net/self_study/article/details/54928371. 对技术感兴趣的同鞋加群 54

android handle详解3 ThreadHandler

在android handle详解2的基础上,我们来学习ThreadHandler ThreadHandler的本质就是对android handle详解2的实现 HandlerThread其实还是一个线程,该线程内部自己创建了一个looper对象,这个是子线程独有的Looper,用来做消息的取出和处理 我们来看看HandlerThread的使用 private HandlerThread mHandlerThread; ...... mHandlerThread = new HandlerTh

Android Scroll详解(三):Android 绘制过程详解

作者: ztelur 联系方式:segmentfault,csdn,github 本文转载请注明原作者.文章来源,链接,版权归原文作者所有. ?本篇为Android Scroll系列文章的最后一篇,主要讲解Android视图绘制机制,由于本系列文章内容都是视图滚动相关的,所以,本篇从视图内容滚动的视角来梳理视图绘制过程. ?如果没有看过本系列之前文章或者不太了解相关的知识,请大家阅读一下一下的文章: Android MotionEvent详解 Android Scroll详解(一):基础知识 A