我按照官方文档设置了一个带有 ViewPager2 的 TabLayout。我以这种方式使用 TabLayoutMediator 将 TabLayout 与 ViewPager2 连接起来:
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position ->
tab.setIcon(getTabIcon(position))
tab.text = getTabTitle(position)
}.attach()
Run Code Online (Sandbox Code Playgroud)
但是 Leak Canary 检测到似乎与 TabLayout 和 TabLayoutMediator 相关的内存泄漏。日志如下:
2020-05-13 17:57:32.914 D/LeakCanary: ????
2020-05-13 17:57:32.914 D/LeakCanary: ? GC Root: Local variable in native code
2020-05-13 17:57:32.914 D/LeakCanary: ?
2020-05-13 17:57:32.914 D/LeakCanary: ?? android.net.ConnectivityThread instance
2020-05-13 17:57:32.914 D/LeakCanary: ? Leaking: NO (PathClassLoader? is not leaking)
2020-05-13 17:57:32.914 D/LeakCanary: ? Thread name: 'ConnectivityThread'
2020-05-13 17:57:32.914 D/LeakCanary: ? ? ConnectivityThread.contextClassLoader
2020-05-13 17:57:32.914 D/LeakCanary: …
Run Code Online (Sandbox Code Playgroud) 当我从启动画面转到主要活动时,LeakCanary会显示以下内存泄漏.我知道这是由于Android操作系统本身的故障导致的预期泄漏,但有没有办法可以避免这种情况(通过在某处设置某些TextView的细节?)
D/LeakCanary? * LEAK CAN BE IGNORED.
D/LeakCanary? * com.gmspartnersltd.earthmiles.views.ActivitySignUp_ has leaked:
D/LeakCanary? * GC ROOT static android.text.TextLine.sCached
D/LeakCanary? * references array android.text.TextLine[].[1]
D/LeakCanary? * references android.text.TextLine.mCharacterStyleSpanSet
D/LeakCanary? * references android.text.SpanSet.spans
D/LeakCanary? * references array android.text.style.CharacterStyle[].[1]
D/LeakCanary? * references com.gmspartnersltd.earthmiles.views.ActivitySignUp$2.this$0 (anonymous class extends android.text.style.ClickableSpan)
D/LeakCanary? * leaks com.gmspartnersltd.earthmiles.views.ActivitySignUp_ instance
D/LeakCanary? [ 05-22 08:54:52.160 13969:18091 D/LeakCanary ]
* Reference Key: bb8124a9-2829-4ff3-8ded-13cf35f80f54
D/LeakCanary? * Device: Genymotion generic Google Nexus 5 - 5.0.0 - API 21 - 1080x1920 vbox86p
D/LeakCanary? * Android Version: …
Run Code Online (Sandbox Code Playgroud) 在onDestroy中
locationManager.removeUpdates(locationListener);
locationListener = null;
Run Code Online (Sandbox Code Playgroud)
匿名实现
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
if (locationManager != null) {
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if (chatId != null) {
double radius = 6378.137;
double oldLat = mLastLocation.getLatitude();
double oldLng = mLastLocation.getLongitude();
double newLat = location.getLatitude();
double newLng = location.getLongitude();
double dLat = Math.toRadians(newLat - oldLat);
double dLng = Math.toRadians(newLng - oldLng);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
+ Math.cos(Math.toRadians(oldLat))
* Math.cos(Math.toRadians(newLat)) * Math.sin(dLng / …
Run Code Online (Sandbox Code Playgroud) 我相信已经成功安装了LeakCanary.
我将调试,发布和测试依赖项添加到build.gradle文件中.
我将必要的文件添加到我的Application Class中.必要时进口.确认应用程序类已正确添加到清单中.我的应用程序类是否需要显式调用?
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
Run Code Online (Sandbox Code Playgroud)
我在模拟器上运行我的应用程序,看不到任何不同.我监控Android监视器并没有看到任何区别.我怎么知道它是否全部有效?我已经分享了我的Application类.
import android.app.Application;
import android.content.res.Configuration;
import com.squareup.leakcanary.LeakCanary;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
return;
}
LeakCanary.install(this);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
public void onLowMemory() {
super.onLowMemory();
}
Run Code Online (Sandbox Code Playgroud)
}
LeakCanary是一个用于Android和Java的内存泄漏检测库. LeakCanary
我的项目基于android make文件系统,它依赖于一些android内部接口和自定义方法.
如何将LeakCanary作为lib添加到我的应用程序中以检测内存泄漏.
我的解决方案:首先,我必须将LeakCanary构建为jar文件,但是如何.因为它是一个gradle目录结构,我之前从未使用过Gradle.
任何提示都很珍贵.
有一段时间我有LeakCanary的问题(我认为自Android Studio 2.2以来,但不确定)
我添加了这个依赖项
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
}
Run Code Online (Sandbox Code Playgroud)
当我点击Android Studio中的播放按钮时,我收到以下错误消息:
$ adb shell am start -n "com.example.debug/com.squareup.leakcanary.internal.DisplayLeakActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Error while executing: am start -n "com.example.debug/com.squareup.leakcanary.internal.DisplayLeakActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.debug/com.squareup.leakcanary.internal.DisplayLeakActivity }
Error type 3
Error: Activity class {com.example.debug/com.squareup.leakcanary.internal.DisplayLeakActivity} does not exist.
Error while Launching activity
Run Code Online (Sandbox Code Playgroud)
但是当我用ClassyShark打开apk文件时,我可以看到活动就在那里.
什么出错了?
我正在使用以下代码在应用中显示视频VideoActivity
:
binding.videoView.setVideoURI(videoUri);
binding.videoView.requestFocus();
binding.videoView.start();
binding.videoView.setOnPreparedListener(new
MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
binding.progressBar.progressOverlay.setVisibility(View.GONE);
}
});
binding.videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
binding.videoView.suspend();
binding.videoView.stopPlayback();
setResult(RESULT_OK);
finish();
}
});
binding.videoSkipButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
binding.videoView.suspend();
binding.videoView.stopPlayback();
setResult(RESULT_OK);
finish();
}
});
Run Code Online (Sandbox Code Playgroud)
如何消除这种泄漏?
我也看到过类似泄漏跟踪的问题:VideoView内存泄漏
但问题在于ButterKnife
解除绑定.我需要做类似的事DataBinding
吗?
我正在尝试使用 LeakCanary 修复内存泄漏,老实说,我无法理解向我展示的堆栈跟踪。我正在使用 firebase 分页选项并停止监听该onDestroy
方法。我也没有将任何活动或上下文传递给适配器,所以我确信这没有问题。以下是来自 LeakCanary 的日志。
HEAP ANALYSIS RESULT
====================================
1 APPLICATION LEAKS
References underlined with "~~~" are likely causes.
Learn more at https://squ.re/leaks.
31417285 bytes retained by leaking objects
Signature: 31c372d2f2d3d219e828763d8f853ceca5851b
????
? GC Root: System class
?
?? leakcanary.internal.InternalLeakCanary class
? Leaking: NO (HomeBuyersActivity? is not leaking and a class is never leaking)
? ? static InternalLeakCanary.resumedActivity
?? com.dreamakers.coonna.Activity.HomeBuyersActivity instance
? Leaking: NO (Activity#mDestroyed is false)
? ? HomeBuyersActivity.mLifecycleRegistry
? ~~~~~~~~~~~~~~~~~~
?? androidx.lifecycle.LifecycleRegistry instance
? …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 LeakCanary 来查找 Android 应用程序中的内存泄漏。我正在使用 Android Studio。
当我开始调试我的应用程序时,我看到“LeakCanary 当前已禁用:在类路径中找到了测试类 org.junit.Test”。信息。
“org.junit.test”类来自外部库。
如何强制启用 LeakCanary?
拥有共享元素动画以及自定义输入动画会导致活动泄漏.
知道可能是什么原因?
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * com.feeln.android.activity.MovieDetailActivity has leaked:
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * GC ROOT android.app.ActivityThread$ApplicationThread.this$0
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.app.ActivityThread.mActivities
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.util.ArrayMap.mArray
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references array java.lang.Object[].[1]
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.app.ActivityThread$ActivityClientRecord.activity
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references com.feeln.android.activity.MovieDetailActivity.mActivityTransitionState
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.app.ActivityTransitionState.mEnterTransitionCoordinator
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.app.EnterTransitionCoordinator.mEnterViewsTransition
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.transition.TransitionSet.mParent
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * …