近日公司需求跟得不紧,就自己找事优化,重构,找内存泄漏(如有错误,烦请拍砖)

内存泄漏工具之前的写的博客也有介绍 内存泄漏检测工具很好用,下面用LeakCanary找一个微信登录引起的内存泄漏(其实微信是有做释放操作,但是文档和demo中没有见到)

泄漏信息

图中可以看出自己应用的WeChatLoginActivity的实例没有回收掉导致的内存泄漏,再往上是WXApiImpV10中的一个内部类ActivityLifecycleCb中持有WeChatLoginActivity的实例导致的

不多说看微信SDK源码

查看createWXAPI的方法(因为WeChatLoginActivity的context是从这里传入的)

    public static IWXAPI createWXAPI(Context var0, String var1, boolean var2) {b.e("MicroMsg.PaySdk.WXFactory", "createWXAPI, appId = " + var1 + ", checkSignature = " + var2);return new WXApiImplV10(var0, var1, var2);}

比较简单直接进入WXApiImplV10,继续看WXApiImplV10

构造方法保存了context,registerApp方法中创建了activitycb,而且我们的泄漏最终是activitycb导致。继续看ActivityLifecycleCb类

   private static final class ActivityLifecycleCb implements ActivityLifecycleCallbacks {private static final String TAG = "MicroMsg.SDK.WXApiImplV10.ActivityLifecycleCb";private static final int DELAYED = 800;private boolean isForeground;private Handler handler;private Context context;private Runnable onPausedRunnable;private Runnable onResumedRunnable;private ActivityLifecycleCb(Context var1) {this.isForeground = false;this.handler = new Handler(Looper.getMainLooper());this.onPausedRunnable = new Runnable() {public void run() {if(WXApiImplV10.activityCb != null && ActivityLifecycleCb.this.isForeground) {Log.v("MicroMsg.SDK.WXApiImplV10.ActivityLifecycleCb", "WXStat trigger onBackground");StatService.trackCustomKVEvent(ActivityLifecycleCb.this.context, "onBackground_WX", (Properties)null);ActivityLifecycleCb.this.isForeground = false;}}};this.onResumedRunnable = new Runnable() {public void run() {if(WXApiImplV10.activityCb != null && !ActivityLifecycleCb.this.isForeground) {Log.v("MicroMsg.SDK.WXApiImplV10.ActivityLifecycleCb", "WXStat trigger onForeground");StatService.trackCustomKVEvent(ActivityLifecycleCb.this.context, "onForeground_WX", (Properties)null);ActivityLifecycleCb.this.isForeground = true;}}};this.context = var1;}public final void onActivityCreated(Activity var1, Bundle var2) {}public final void onActivityDestroyed(Activity var1) {}public final void onActivityPaused(Activity var1) {Log.v("MicroMsg.SDK.WXApiImplV10.ActivityLifecycleCb", var1.getComponentName().getClassName() + "  onActivityPaused");this.handler.removeCallbacks(this.onResumedRunnable);this.handler.postDelayed(this.onPausedRunnable, 800L);}public final void onActivityResumed(Activity var1) {Log.v("MicroMsg.SDK.WXApiImplV10.ActivityLifecycleCb", var1.getComponentName().getClassName() + "  onActivityResumed");this.handler.removeCallbacks(this.onPausedRunnable);this.handler.postDelayed(this.onResumedRunnable, 800L);}public final void onActivitySaveInstanceState(Activity var1, Bundle var2) {}public final void onActivityStarted(Activity var1) {}public final void onActivityStopped(Activity var1) {}public final void detach() {this.handler.removeCallbacks(this.onResumedRunnable);this.handler.removeCallbacks(this.onPausedRunnable);this.context = null;}}

注意他在onActivityPaused和onActivityResumed进行了一个延时,如果短时间再次启动  就会造成泄漏,如果registerActivityLifecycleCallbacks是有注销方法,也基本再次打开页面也会有内存泄漏。继续看你会发现一个detach方法,也就是微信写了释放,但是demo和文档没有说这个事。看到这里你应该就明白怎么解决

在WeChatLoginActivity中的onDestroy中调用IWXAPI.detach();即可

因为微信登录正常就打开第一次然后就不会再打开,所以这个内存泄漏基本不会遇到。

Android微信登录引起的内存泄漏相关推荐

  1. Android微信登录在华为手机上无法调起授权界面的问题

    Android微信登录在华为手机上无法调起授权界面的问题 App集成了微信登录,在其他手机上微信登录都可以正常调起微信授权页面,并且登录成功,但是 在华为手机上调用微信登录,没报异常,也无法调起微信授 ...

  2. android 微信登录与分享集成

    android 微信登录与分享 android微信登录与分享这两个功能是很常用的,尤其是现在微信用户日益剧增,qq虽然很经典但是感觉大多数用来办公 每个写android的小伙伴估计都会写到这个功能,我 ...

  3. android 微信登录不回调,Anroid 进阶之旅 | 微信登录没有回调的问题

    Android微信登录,分享后没有回调 (创建wxapi包的时候,一定要和开放平台填写的路径一致) Android实现微信第三方登录的情况非常多,今天在做微信登录的时候,始终无法回调WXEntryAc ...

  4. android 微信登录返回 -6

    android 微信登录返回 -6 场景: 使用Android studio运行debug版程序,微信登录返回errocode = -6 .无法正常登录 原因: 网上查阅下:是签名与微信开放平台上注册 ...

  5. Android 如何做一次内存泄漏大排查

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/112335970 本文出自[赵彦军的博客] 文章目录 前言 把内存泄漏的地方找出来 ...

  6. Android 微信登录

    /1.首先你得到微信.开放平台申请开发权限:https://open.weixin.qq.com/ 申请通过效果如下即可 2.其次,阅读开发文档: https://open.weixin.qq.com ...

  7. 火速收藏!Android 开发者必会的内存泄漏指南

    [CSDN 编者按]对于众多 Android 程序员而言,在需求与应用性能之间,主要精力都会放到新需求的开发.随着项目复杂度的增加,应用性能越来越低,出现各种问题.程序员们奔波于各种"救火现 ...

  8. Android开发-Handler引起的内存泄漏-实验、分析、总结。

    介绍 最近在恶补Handler的知识,其中就涉及到了Handler引起的内存泄露问题,网络上有很多的分析文章.我就按照这些文章的思路,写代码验证,主要是验证和记录.  使用的内存检测工具是:LeakC ...

  9. android微信登录的app签名 和 项目正式签名替换默认签名

    之前微信登录的时候需要应用的签名,然后就直接用android studio自带的工具Build–>Generate Signed APK 获取了签名,给微信弄上就以为ok了,运行一下还是调不起微 ...

最新文章

  1. Imagenet VGG-19网络加载和特征可视化
  2. 网站建设中图片挑选也要看方法!
  3. 学会python编程容易吗-Python编程入门难不难
  4. Boost:bind的noexcept成员函数的type <>语法的测试程序
  5. iOS-语法syntax
  6. oracle 11g r2版本号,Oracle 11g r2新增版本功能(二)
  7. Unity的包体压缩以及音效优化
  8. SSH框架java写接口_SSH框架的搭建+JPA接口
  9. OPTEE学习笔记 - IPC
  10. GOBY--一款攻击面测绘工具的使用
  11. N个数选出M个最小或最大值算法
  12. Java开发面试常见问题总结
  13. 51ditu:地图基础知识
  14. 钢铁侠或漫威中有哪些黑科技?
  15. Mac 如何删除应用、软件
  16. 35岁程序员失业了,找不到合适工作?看完让人心疼……
  17. Educational Codeforces Round 112 (Rated for Div. 2)(补题)
  18. 到底什么是语义分割?
  19. 学生信息统计(顺序表)
  20. Linux07_文件操作

热门文章

  1. 怎样下载谷歌最新版100.0.4896.127chromedriver
  2. stc15系列c语言pwm编程,stc15f2k60s2单片机 pwm程序 可调占空比
  3. 微信小程序组件库——colorUI 的使用方法
  4. 不拆无损,在北汽EU5,EU7,EX3,EX7安装app应用
  5. 怎么隐藏CAD文件里的图层?
  6. 腾讯视频怎么下载_QQ视频如何下载到本地保存
  7. 洞见(1): zig 编程语言
  8. 根据输入的电话号码查询联系人
  9. 关于七彩虹显卡命名解说
  10. 7-2 大小写字母转换