Android Handler 防内存泄漏

package com.tv.ui.metro.utils;

import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;

import com.thunder.ktv.thunderjni.thunderapi.TDHotspot;import com.tv.ui.metro.MainActivity;import com.tv.ui.metro.model.GenericSubjectItem;import com.tv.ui.metro.model.KtvMainModuleDisplayItem;import com.tv.ui.metro.view.KtvLogoView;

import java.lang.ref.WeakReference;import java.util.ArrayList;

/** * Created by Administrator on 16-4-5. */public class ActivityHelper {    public static class MainHandler extends Handler {

        private static MainHandler _this;        public static final int MAIN_MODULE_JSON_READY = 1;        public static final int LEFT_TOP_HST_READY = 2;        public static String KEY_RAW_JSON = "raw_json";        public static String KEY_LEFT_TOP_LIST = "lt_list";        WeakReference<Activity> mActivityReference;

        MainHandler(Activity activity) {            super(activity.getMainLooper());            mActivityReference = new WeakReference<Activity>(activity);        }

        public static MainHandler getInstance(Activity activity) {            if (_this == null) {                _this = new MainHandler(activity);            }            return _this;        }

        @Override        public void handleMessage(Message msg) {            final MainActivity activity = (MainActivity) mActivityReference.get();            Bundle b;            if (activity != null) {                switch (msg.what) {                    case MAIN_MODULE_JSON_READY:                        Log.d("MainActivity", "handleMessage MAIN_MODULE_JSON_READY");                        //更新UI                        b = msg.getData();                        GenericSubjectItem<KtvMainModuleDisplayItem> json = (GenericSubjectItem<KtvMainModuleDisplayItem>) b.getSerializable(KEY_RAW_JSON);                        activity.updateTabsAndMetroUI(json);                        activity.getTabHost().requestLayout();                        final View tabView = activity.getTabs().getChildTabViewAt(activity.getViewPager().getCurrentItem());                        tabView.post(new Runnable() {                            @Override                            public void run() {                                tabView.requestFocus();                            }                        });                        break;                    case LEFT_TOP_HST_READY:                        Log.d("MainActivity", "handleMessage LEFT_TOP_HST_READY");                        b = msg.getData();                        b.getSerializable(KEY_LEFT_TOP_LIST);                        KtvLogoView lv = activity.getLogoView();                        lv = new KtvLogoView(activity);                        activity.setLogoView(lv);                        lv.setHsList((ArrayList<TDHotspot>) b.getSerializable("lt_list"));                        break;                }            }        }    }}
时间: 2024-10-23 08:58:24

Android Handler 防内存泄漏的相关文章

Android Handler 避免内存泄漏的用法总结

Android开发经常会用到handler,但是我们发现每次使用Handler都会出现:This Handler class should be static or leaks might occur(null)这样的提示.Android lint就是为了提示我们,这样使用Handler会容易造成内存泄漏.但是你会发现其实改成static并没有什么用.因为这并没有解决这个问题的根本. 首先,我们得确认,为什么会有内存泄漏?因为Handler是基于消息的.每次new 出Handler,都会创建一个

从使用Handler致内存泄漏角度源码追踪Handler工作机制

使用Handler时内存泄漏分析 在Android中,处理完异步任务后常常会在主线程进行一些操作,所以我们可能会使用到Handler,下面是Handler的常见使用方法: public class MainActivity extends AppCompatActivity { private Handler mHanlder = new Handler() { @Override public void handleMessage(Message msg) { //TODO } }; } 但是

Android应用程序内存泄漏介绍

Android应用程序内存泄漏介绍 内存泄漏和内存溢出的区别 内存溢出(out of memory)是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory.比如在我们每个Android程序在运行时系统都会给程序分配一个一定的内存空间,当程序在运行中需要的内存超出这个限制就会报内存溢出(out of memory). 内存泄漏(memory leak)是指程序在申请内存后,无法释放已申请的内存空间.多次内存无法被释放,程序占用的内存会一直增加,直到超过系统的内存限制报内存

handler的内存泄漏问题

Handler的内存泄漏的问题? 所谓的内存泄漏就是这个对象没有任何使用价值了但是由于任然存在引用导致内存被占用了垃圾回收器回收不了..... 至于为什么会出现内存泄漏呢? 这里面的原理是很深很深的,因为new 的handler是一个内部类对象对外部类对象有个隐试强引用. 内部类对外部类有个隐试强引用其实并没有导致内存泄漏,尽管activity的引用被内部类对象持有着,大不了内部类对象先被回收,外部类还是可以被回收的,关键是由于上一篇文章中我特地强调了在Handler内部有个msg.target

基于Android Studio的内存泄漏检测与解决全攻略

自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclipse,成为主流的Android开发IDE.Android Studio在为我们提供了良好的编码体验的同时,也提供了许多对App性能分析的工具,让开发者可以更方便分析App性能.Google在IO大会上一直告诫开发者不要无节制的使用手机内存,要注意一些不良的开发习惯会导致App的内存泄漏.虽然如今网上

Android studio 分析内存泄漏

以前用eclipse的时候,我们采用的是DDMS和MAT,不仅使用步骤复杂繁琐,而且要手动排查内存泄漏的位置,操作起来比较麻烦.后来随着Android studio的潮流,我也抛弃了eclipse加入了AS. Android Studio也开始支持自动进行内存泄漏检查,并且操作起来也比较方便. 我们大家都知道,系统是不可能将所有的内存都分配给我们的应用程序的.每个程序都会有可使用的内存上限,这被称为堆大小(Heap Size).不同的手机,堆大小也不尽相同,随着现在硬件设备不断提高,堆大小也提升

使用 Android Studio 检测内存泄漏与解决内存泄漏问题

自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclipse,成为主流的Android开发IDE.Android Studio在为我们提供了良好的编码体验的同时,也提供了许多对App性能分析的工具,让开发者可以更方便分析App性能.Google在IO大会上一直告诫开发者不要无节制的使用手机内存,要注意一些不良的开发习惯会导致App的内存泄漏.虽然如今网上

android性能测试之内存泄漏

1.什么是内存泄漏? 内存泄漏就是向系统申请内存使用,却不归还(释放),导致该内存既不能被自己使用也不能被别人使用. 2.内存泄漏和内存溢出有什么区别? 内存泄漏是分配出去的内存无法回收. 内存溢出是程序使用的内存超出了系统能给予的. 3.如何从测试数据中得出内存泄漏? 首先,我们需要使用性能测试工具去监控性能数据,android可使用GT.apk(下载地址:http://gt.tencent.com/)监控内存数据.然后,对测试对象连续重复做完全相同的操作多次.然后,将测试结果(内存)制作成折

Android Handler防止内存溢出的写法

时间:2016年4月20日14:21:49 static class MyHandler extends Handler { private WeakReference<Context> weakReference; public MyHandler(Context context) { weakReference = new WeakReference<>(context); } @Override public void handleMessage(Message msg) {