- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这个问题我已经有一段时间了,我真的不知道还能尝试什么。我在我的项目中加入了 Leakcanary,这样我就可以强制自己“以正确的方式”学习 android,而不会选择导致内存泄漏的模式。我正在构建一个应用程序,我已经将它剥离了很多,但我仍然看到这种泄漏正在发生。
我有一个 Activity,里面有一个 viewpager 并实例化了 10 个 fragment 。如果我打开设备,一切似乎都很好,直到我按下“Home”,我才得到以下内存泄漏:
D/LeakCanary﹕ In com.doesnthaveadomain.leo.calendartracker:1.0:1.
D/LeakCanary﹕ * com.doesnthaveadomain.leo.calendartracker.MyFragment has leaked:
D/LeakCanary﹕ * GC ROOT static android.view.WindowManagerGlobal.sDefaultWindowManager
D/LeakCanary﹕ * references android.view.WindowManagerGlobal.mRoots
D/LeakCanary﹕ * references java.util.ArrayList.array
D/LeakCanary﹕ * references array java.lang.Object[].[0]
D/LeakCanary﹕ * references android.view.ViewRootImpl.mInvalidateOnAnimationRunnable
D/LeakCanary﹕ * references android.view.ViewRootImpl$InvalidateOnAnimationRunnable.mViews
D/LeakCanary﹕ * references java.util.ArrayList.array
D/LeakCanary﹕ * references array java.lang.Object[].[0]
D/LeakCanary﹕ * references android.support.v4.view.ViewPager.mAdapter
D/LeakCanary﹕ * references com.doesnthaveadomain.leo.calendartracker.MyAdapter.mCurrentPrimaryItem
D/LeakCanary﹕ * leaks com.doesnthaveadomain.leo.calendartracker.MyFragment instance
主要 Activity :
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import java.lang.ref.WeakReference;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager mViewPager = (ViewPager) findViewById(R.id.viewpager);
MyAdapter myAdapter = new MyAdapter(getSupportFragmentManager(), this);
mViewPager.setAdapter(myAdapter);
mViewPager.setCurrentItem(5);
}
}
class MyAdapter extends FragmentStatePagerAdapter {
private int mNumberOfViews;
private final WeakReference<AppCompatActivity> mActivityWeakRef;
public MyAdapter(FragmentManager fm,
AppCompatActivity activity) {
super(fm);
mActivityWeakRef = new WeakReference<AppCompatActivity>(activity);
mNumberOfViews = 10;
}
@Override
public Fragment getItem(int position) {
MyFragment myFragment = new MyFragment();
AppCompatActivity activity = mActivityWeakRef.get();
if (activity != null) {
MyApp.getRefWatcher(mActivityWeakRef.get()).watch(myFragment);
}
return myFragment;
}
@Override
public int getCount() {
return mNumberOfViews;
}
}
主要 Activity 布局:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.design.widget.AppBarLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar_appbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true" >
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:theme="@style/AppTheme.Toolbar"
app:popupTheme="@style/AppTheme.Toolbar.Popup">
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
fragment :
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A placeholder fragment containing a simple view.
*/
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_test, container, false);
}
}
fragment 布局:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_vertical_margin"
android:paddingStart="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_vertical_margin"
android:paddingEnd="@dimen/activity_vertical_margin"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
</LinearLayout>
最佳答案
与我的其他问题相同,我在错误的时间初始化 ref watcher,在 fragment 创建时而不是在销毁时:https://stackoverflow.com/a/32881096/5278339
关于android - Leakcanary 使用 AppCompatActivity 和 FragmentStatePagerAdapter 显示 fragment 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32749332/
我正在使用 this example 处理 FragmentStatePagerAdapter . MyAdapter 类实现如下: public static class MyAdapter ext
当我使用 FragmentStatePagerAdapter 扩展我的适配器并使用 fragment 管理器和常量 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 传递参数
我在使用 FragmentStatePagerAdapter 管理更改的项目列表时遇到问题。请查来源here . 问题是,当底层列表更改时,并且我调用 notifyDataSetChanged,适配器
我正在实现FragmentStatePagerAdapter并且我想要一个可拖动的标题。每个 fragment 的标题都可以像寻呼机效果一样进行交互。用户可以拖动或浏览所有 fragment 的tit
我已经实现了一个在 viewpager 中显示 fragment 的 Activity 。该 Activity 最初显示给定类型(类型 A)的 5 个 fragment 。每个类型 A fragmen
我知道还有其他几篇关于此主题的帖子,但我想粘贴我的代码,因为我相信其中可能存在导致我出现问题的错误。我的 FragmentStatePagerAdapter 返回了错误的位置,我不确定为什么。 这是我
在我的主要 Activity 中,我有多个 fragment ,您可以通过底部导航进行导航(替换主要 Activity XML 中的 FrameLayout 容器) 其中一个 Fragment 包含一
我有一个 ViewPager+FragmentStatePagerAdapter 主机 Activity ,它让我可以浏览一组 fragment (同一 ItemFragment 类的不同实例),并且
我在我正在开发的应用程序中遇到了 OutOfMemoryErrors,我很难弄清楚如何修复它以及到底是什么问题。我正在使用 FragmentStatePagerAdapter,因为这似乎是最佳/推荐的
我想知道是否可以在没有支持库的情况下使用 FragmentStatePagerAdapter 类或其等效类? 我知道如何使用 native fragment 来代替支持库中的 fragment ,并且
我有一个 ViewPager,其中的页面数是动态的。每个页面都需要从数据库读取并显示该页面的数据集。 我将当前选定的页面标题与数据库“用户名”中的第一个值进行比较,以检查数据是否与该页面相关。 我的
我正在尝试在 View 页面中显示一些 fragment 。我使用从 NavigationDrawer 启动 PlanFragment FragmentTransaction transaction
我正在学习教程 here它使用带有 FragmentStatePagerAdapter 的 TabLayout。一切都很好,除了我需要禁用我的第二个选项卡上的滑动,因为它使用水平滚动。如果所有选项卡都
Noob android 开发者的问题 问题缺失: 我正在尝试实现无限滚动功能,当 FragmentStatePagerAdapter 到达最后一项时通过网络请求加载更多数据,目前我将 getCoun
我有一个 ViewPager,其中包含 Fragment。 ViewPager 有一个适配器 FragmentStatePagerAdapter 适配器的 getItem 方法。 @Override
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我创建了一组水平选项卡,对于每个选项卡内容,它都有一个 View 分页器,它又允许滑动 View 的内容。 我目前正在将其编码为适配器中的 3 个 View ,并返回一个新的内部 fragment ,
我有一个名为 MainActivity 的 Activity ,它有一个 ViewPager 和一个 TabLayout。 ViewPager 有 4(四)个 fragment 绑定(bind)在那里
我想要实现的目标: 带有 ViewPager 的 Activity,显示适配器中对象列表的 fragment (FragmentStatePagerAdapter)。 最初,Activity 将 SQ
我在我的单一 Activity 应用程序上使用嵌套的 FragmentStatePagerAdapter。当前布局是: Activitiy - Login Fragment - Master
我是一名优秀的程序员,十分优秀!