0

我有片段通过Retrofit+进行 API 调用RxJava。我订阅并处Subscription置于。当我从 切换到仍在处理 API 调用时,会出现在. 这意味着内容保留在屏幕顶部并且无法控制它。onActivityCreatedonDestroyFragmentAFragmentBFragmentAFragmentBFragmentAFragmentA

片段A.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);
                }
            }));
    }
}

片段B.java

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

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

4

1 回答 1

0

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

    swipeRefreshLayout.setRefreshing(false);
    swipeRefreshLayout.destroyDrawingCache();
    swipeRefreshLayout.clearAnimation();
    super.onDestroyView();
}
于 2017-07-29T10:50:59.297 回答