首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Viewpager中使用recyclerview分离视图之前,如何分离父视图?

在Viewpager中使用recyclerview分离视图之前,如何分离父视图?
EN

Stack Overflow用户
提问于 2020-08-19 16:29:20
回答 1查看 109关注 0票数 0

由于我的recyclerview,我遇到了内存泄漏的问题,它显示LeakCanary中的View detached and has parent。我尝试在onDestroyView上将recyclerview设置为null,但仍然没有任何反应。下面是我的片段和LeakCanary的堆栈跟踪:

代码语言:javascript
复制
public class CancelledOrdersFragment extends Fragment {
    private RecyclerView recyclerView;
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CancelledOrdersAdapter adapter;
    private OrderTransactionsModel model;

    public CancelledOrdersFragment() {
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View itemView = inflater.inflate(R.layout.fragment_cancelled_orders, container, false);
        recyclerView = itemView.findViewById(R.id.cancelled_orders_rv);

        LinearLayoutManager linearLayoutManager1 = new LinearLayoutManager(itemView.getContext());
        linearLayoutManager1.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(linearLayoutManager1);

        Paper.init(itemView.getContext());
        String storeID = Paper.book().read("userid");

        Query query = db.collection("Transactions").whereEqualTo("storeID", storeID).whereEqualTo("transactionStatus", "cancelled").orderBy("orderTimeout", Query.Direction.DESCENDING);

        PagedList.Config Bconfig = new PagedList.Config.Builder()
                .setEnablePlaceholders(false)
                .setPrefetchDistance(10)
                .setPageSize(8)
                .build();

        FirestorePagingOptions<OrderTransactionsModel> options = new FirestorePagingOptions.Builder<OrderTransactionsModel>()
                .setLifecycleOwner(getActivity())
                .setQuery(query, Bconfig, snapshot -> {
                    OrderTransactionsModel transactionsModel = snapshot.toObject(OrderTransactionsModel.class);
                    String transID = transactionsModel.getTransactionID();
                    String tranCOde = transactionsModel.getTransactionCode();
                    double storeTotal = transactionsModel.getStoreTotal();
                    HashMap<String, Object> CouponUsed = transactionsModel.getCouponUsed();
                    HashMap<String, Date> OrderStatus = transactionsModel.getOrderStatus();

                    model = new OrderTransactionsModel(transID, storeID, storeTotal, CouponUsed, OrderStatus, tranCOde);
                    return model;
                })
                .build();

        adapter = new CancelledOrdersAdapter(options);
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();

        return itemView;
    }


    @Override
    public void onDestroyView() {
        super.onDestroyView();
        adapter.stopListening();
        recyclerView = null;
    }

    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        adapter.startListening();
    }
代码语言:javascript
复制
 ┬───
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │ GC Root: Local variable in native code
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ android.net.ConnectivityThread instance
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: NO (PathClassLoader↓ is not leaking)
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Thread name: 'ConnectivityThread'
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ ConnectivityThread.contextClassLoader
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ dalvik.system.PathClassLoader instance
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: NO (InternalLeakCanary↓ is not leaking and A ClassLoader is never leaking)
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ PathClassLoader.runtimeInternalObjects
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ java.lang.Object[] array
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: NO (InternalLeakCanary↓ is not leaking)
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ Object[].[1614]
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ leakcanary.internal.InternalLeakCanary class
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: NO (OrdersActivity↓ is not leaking and a class is never leaking)
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ static InternalLeakCanary.resumedActivity
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ com.dreamakers.clustore.clustorestore.Activity.OrdersActivity instance
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: NO (Activity#mDestroyed is false)
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ OrdersActivity.mLifecycleRegistry
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │                     ~~~~~~~~~~~~~~~~~~
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ androidx.lifecycle.LifecycleRegistry instance
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: UNKNOWN
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ LifecycleRegistry.mObserverMap
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │                        ~~~~~~~~~~~~
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ androidx.arch.core.internal.FastSafeIterableMap instance
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: UNKNOWN
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ FastSafeIterableMap.mEnd
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │                          ~~~~
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ androidx.arch.core.internal.SafeIterableMap$Entry instance
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: UNKNOWN
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ SafeIterableMap$Entry.mKey
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │                            ~~~~
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ com.dreamakers.clustore.clustorestore.Adapter.CancelledOrdersAdapter instance
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: UNKNOWN
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ CancelledOrdersAdapter.mObservable
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │                             ~~~~~~~~~~~
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ androidx.recyclerview.widget.RecyclerView$AdapterDataObservable instance
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: UNKNOWN
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ RecyclerView$AdapterDataObservable.mObservers
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │                                         ~~~~~~~~~~
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ java.util.ArrayList instance
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: UNKNOWN
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ ArrayList.elementData
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │                ~~~~~~~~~~~
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ java.lang.Object[] array
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: UNKNOWN
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ Object[].[0]
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │               ~~~
2020-08-19 16:23:59.404 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ androidx.recyclerview.widget.RecyclerView$RecyclerViewDataObserver instance
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: UNKNOWN
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ RecyclerView$RecyclerViewDataObserver.this$0
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │                                            ~~~~~~
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ├─ androidx.recyclerview.widget.RecyclerView instance
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    Leaking: YES (View detached and has parent)
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    mContext instance of com.dreamakers.clustore.clustorestore.Activity.OrdersActivity with mDestroyed = false
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    View#mParent is set
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    View#mAttachInfo is null (view detached)
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    View.mID = R.id.cancelled_orders_rv
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    View.mWindowAttachCount = 1
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: │    ↓ RecyclerView.mParent
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ╰→ android.widget.FrameLayout instance
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ​     Leaking: YES (ObjectWatcher was watching this because com.dreamakers.clustore.clustorestore.Activity.CancelledOrdersFragment received Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks))
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ​     key = 1bb796b4-4c87-4320-b90a-a348a14e616e
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ​     watchDurationMillis = 8633
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ​     retainedDurationMillis = 3631
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ​     mContext instance of com.dreamakers.clustore.clustorestore.Activity.OrdersActivity with mDestroyed = false
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ​     View#mParent is null
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ​     View#mAttachInfo is null (view detached)
2020-08-19 16:23:59.405 11647-13298/com.dreamakers.clustore.clustorestore D/LeakCanary: ​     View.mWindowAttachCount = 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-30 16:05:51

泄漏跟踪显示OrdersActivity是活动的(没有被销毁,一切正常),并且它的生命周期注册表有一个包含CancelledOrdersAdapter的mObserverMap。

根据代码,CancelledOrdersAdapter和R.id.cancelled_orders_rv RecyclerView的生命周期似乎应该保持一致。

然而,当回收器视图被分离时,CancelledOrdersAdapter被保存在内存中,因为它注册为活动的生命周期的观察者(此时不会被销毁)。修复可能会让CancelledOrdersAdapter注册为片段视图生命周期的观察者,即Fragment.viewLifecycleOwner

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63482987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档