public RequestManager get(Fragment fragment){ if (fragment.getActivity() == null) { thrownew IllegalArgumentException("You cannot start a load on a fragment before it is attached"); } if (Util.isOnBackgroundThread()) { return get(fragment.getActivity().getApplicationContext()); } else { FragmentManager fm = fragment.getChildFragmentManager(); return supportFragmentGet(fragment.getActivity(), fm); } }
//以FragmentManager为key,RequestManagerFragment为value缓存用以绑定寿命周期的RequestManagerFragment,严格说这不是一个缓存,只是用来暂时保存已生成的还未被使用的RequestManagerFragment final Map<FragmentManager, SupportRequestManagerFragment> pendingSupportRequestManagerFragments = new HashMap<FragmentManager, SupportRequestManagerFragment>();
SupportRequestManagerFragment getSupportRequestManagerFragment(final FragmentManager fm){ //先从FragmentManager根据TAG获取RequestManagerFragment SupportRequestManagerFragment current = (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG); if (current == null) { //如果为空,再从pending缓存里获取 current = pendingSupportRequestManagerFragments.get(fm); if (current == null) { //如果为空,则生成一个新的RequestManagerFragment并add到对应的FragmentManager里 current = new SupportRequestManagerFragment(); pendingSupportRequestManagerFragments.put(fm, current); fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss(); handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget(); } } return current; }
@Override publicvoidonLowMemory(){ super.onLowMemory(); // If an activity is re-created, onLowMemory may be called before a manager is ever set. // See #329. if (requestManager != null) { requestManager.onLowMemory(); } }
ConnectivityMonitor connectivityMonitor = factory.build(context, new RequestManagerConnectivityListener(requestTracker));
// If we're the application level request manager, we may be created on a background thread. In that case we // cannot risk synchronously pausing or resuming requests, so we hack around the issue by delaying adding // ourselves as a lifecycle listener by posting to the main thread. This should be entirely safe. if (Util.isOnBackgroundThread()) { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override publicvoidrun(){ lifecycle.addListener(RequestManager.this); } }); } else { lifecycle.addListener(this); } lifecycle.addListener(connectivityMonitor); }