到目前为止,我使用的是Volley,但是在浏览了Robospice库之后,它具有优于其他网络库的优点,因此我在当前项目中开始使用它。

它工作正常,但是由于它的生命周期与活动相关,而不是与片段相关,因此我在片段中实现了相同的操作,如下所示。

public class MainActivityFragment extends Fragment {
 private SpiceManager spiceManager = new SpiceManager(JacksonSpringAndroidSpiceService.class);
private static final String KEY_LAST_REQUEST_CACHE_KEY = "lastRequestCacheKey";
private String lastRequestCacheKey;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        performRequest(mSort);
        return rootView;
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        if (!TextUtils.isEmpty(lastRequestCacheKey)) {
            outState.putString(KEY_LAST_REQUEST_CACHE_KEY, lastRequestCacheKey);
        }
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        if (savedInstanceState != null && savedInstanceState.containsKey(KEY_LAST_REQUEST_CACHE_KEY)) {
            lastRequestCacheKey = savedInstanceState.getString(KEY_LAST_REQUEST_CACHE_KEY);
            spiceManager.addListenerIfPending(MovieDataResult.class, lastRequestCacheKey,
                    new ListMovieRequestDataListener(movieImageAdapter, getActivity(),progressDialog));
            spiceManager.getFromCache(MovieDataResult.class, lastRequestCacheKey, DurationInMillis.ONE_MINUTE,
                    new ListMovieRequestDataListener(movieImageAdapter, getActivity(),progressDialog));

        }
        super.onActivityCreated(savedInstanceState);
    }
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        spiceManager.start(getActivity());
    }

    @Override
    public void onStop() {
        super.onStop();
        if (spiceManager.isStarted()) {
            spiceManager.shouldStop();
        }
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        mSort = Utility.getPreferredSorting(getActivity());
        setUpProgressDialog();
    }

    private void performRequest(String mSort) {
        MovieDataRequest movieDataRequest = new MovieDataRequest(apiKey,mSort);
        lastRequestCacheKey = movieDataRequest.createCacheKey();
        spiceManager.execute(movieDataRequest, lastRequestCacheKey,
                DurationInMillis.ONE_MINUTE, new ListMovieRequestDataListener(movieImageAdapter, getActivity(),progressDialog));
    }
}


我想知道,是否可以遵循生命周期,所以效果很好。作为,我开始spicemanager onAttach()并停止onStop()和onRestoreInstance()获取缓存的数据。

基本上,这就是它的工作方式->


附加片段时,spicemanager启动
然后调用.execute()进行网络请求
spicemanager被破坏onStop()


另外,为每个活动都配备一个spicemanager是一个好方法吗?

最佳答案

最近,当我在活动和片段类中创建spiceManagers时,我也在考虑这个问题。

这实际上导致我在多个位置都有spiceManager对象,对我来说,我认为这不是做事的最有效方法。

最终,我决定要做的是在我的活动中创建spiceManager的静态实例:

public static SpiceManager spiceManager = new SpiceManager(SpiceService.class);


然后在我的片段中使用此静态spiceManager:

MainActivity.spiceManager.start(getActivity());


我还认为,执行此操作的最有效方法可能是使用接口将要由robospice处理的数据传输回活动,而仅使用活动内部的spiceManager来完成所有工作。但是,这可能是一项主要工作。

关于android - fragment 中的Robospice生命周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33322666/

10-11 00:15