被破坏的片段内容保留在屏幕上

Destroyed fragment content remains on screen

我有片段通过 Retrofit + RxJava 进行 API 调用。我在 onActivityCreated 订阅了 Subscription 并在 onDestroy 配置了。当我从 FragmentA 切换到 FragmentBFragmentA 仍在处理 API 调用时,FragmentB 出现在 FragmentA 的内容下方。这意味着 FragmentA 内容保留在屏幕顶部,无法对其进行控制。

FragmentA.java

public class FragmentA extends Fragment {

    @BindView(R.id.swipe_refresh) SwipeRefreshLayout mSwipeRefresh;
    @BindView(R.id.recycler_view) RecyclerView mRecyclerView;

    private ItemsAdapter mAdapter;

    private CompositeDisposable mCompositeDisposable = new CompositeDisposable();

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_list, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        ButterKnife.bind(this, view);

        mSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                fetchItems();
            }
        });

        mAdapter = new ItemsAdapter();

        mRecyclerView.setAdapter(mAdapter);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mSwipeRefresh.setRefreshing(true);
        fetchItems();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mCompositeDisposable.clear();
    }

    private void fetchItems() {
        RequestInterface requestInterface = Utils.createService();
        mCompositeDisposable.add(requestInterface.getItemsForA()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Response>() {
                @Override
                public void accept(@NonNull Response response) throws Exception {
                    mAdapter.swapItems(response.getItems());
                    mSwipeRefresh.setRefreshing(false);
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(@NonNull Throwable throwable) throws Exception {
                    Toast.makeText(getActivity(), "Error: " + throwable.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                    mSwipeRefresh.setRefreshing(false);
                }
            }));
    }
}

FragmentB.java

public class FragmentB extends Fragment {
    //Same as `FragmentA` but different API call
}

我也做了一些日志记录,发现 FragmentA 的所有生命周期方法都被调用,包括 onDestroyView

您需要在 SwipeRefreshLayout 上调用以下方法来解决此问题。

    swipeRefreshLayout.setRefreshing(false);
    swipeRefreshLayout.destroyDrawingCache();
    swipeRefreshLayout.clearAnimation();
    super.onDestroyView();
}