片段中的 Robospice 生命周期
Robospice lifecycle in fragment
到目前为止,我使用的是 Volley,但在浏览了 Robospice 库之后,它比其他网络库更有优势,我开始在我当前的项目中使用它。
它工作正常,但由于它的生命周期与 activity 而不是片段相关,所以我在这样的片段中实现了相同的功能。
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()
此外,为每个 activity 设置一个 spicemanager 是不是一个好方法?
我最近也在思考这个问题,因为我在我的活动和片段中都创建了 spiceManagers 类。
这实际上导致我在多个地方拥有 spiceManager 对象,对我来说,我认为这不是最有效的处理方式。
最终,我决定做的是在我的 activity:
中创建一个 spiceManager 的静态实例
public static SpiceManager spiceManager = new SpiceManager(SpiceService.class);
然后在我的片段中使用这个静态 spiceManager:
MainActivity.spiceManager.start(getActivity());
我还认为最有效的方法可能是使用接口将要由 robospice 处理的数据传输回 activity,然后只使用 [=22= 中的 spiceManager ] 做所有的工作。然而,这可能是一项主要工作。
到目前为止,我使用的是 Volley,但在浏览了 Robospice 库之后,它比其他网络库更有优势,我开始在我当前的项目中使用它。
它工作正常,但由于它的生命周期与 activity 而不是片段相关,所以我在这样的片段中实现了相同的功能。
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()
此外,为每个 activity 设置一个 spicemanager 是不是一个好方法?
我最近也在思考这个问题,因为我在我的活动和片段中都创建了 spiceManagers 类。
这实际上导致我在多个地方拥有 spiceManager 对象,对我来说,我认为这不是最有效的处理方式。
最终,我决定做的是在我的 activity:
中创建一个 spiceManager 的静态实例public static SpiceManager spiceManager = new SpiceManager(SpiceService.class);
然后在我的片段中使用这个静态 spiceManager:
MainActivity.spiceManager.start(getActivity());
我还认为最有效的方法可能是使用接口将要由 robospice 处理的数据传输回 activity,然后只使用 [=22= 中的 spiceManager ] 做所有的工作。然而,这可能是一项主要工作。