当可见的时候加载 不可见的时候不加载
public abstract class BasicFragment extends Fragment implements FragmentUserVisibleController.UserVisibleCallback{
private FragmentUserVisibleController fragmentUserVisibleController;
public BasicFragment() {
fragmentUserVisibleController = new FragmentUserVisibleController(this,this);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
fragmentUserVisibleController.activityCreated();
}
@Override
public void onResume() {
super.onResume();
fragmentUserVisibleController.resume();
}
@Override
public void onPause() {
super.onPause();
fragmentUserVisibleController.pause();
}
protected abstract void lazyLoad();
/**
* 设置懒加载
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
fragmentUserVisibleController.setUserVisibleHint(isVisibleToUser);
}
/**
* 内存泄露排查
*/
@Override
protected void finalize() throws Throwable {
super.finalize();
// TODO 内存泄露排查,内存使用占满的时候,引发GC,将在这里抛出
Log.e("FINALIZE", this.getClass().getName()+"have been recycled,that's maybe memory leaked!");
}
@Override
public void setWaitingShowToUser(boolean waitingShowToUser) {
fragmentUserVisibleController.setWaitingShowToUser(waitingShowToUser);
}
@Override
public boolean isWaitingShowToUser() {
return fragmentUserVisibleController.isWaitingShowToUser();
}
@Override
public boolean isVisibleToUser() {
return fragmentUserVisibleController.isVisibleToUser();
}
@Override
public void callSuperSetUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
}
@Override
public void onVisibleToUserChanged(boolean isVisibleToUser, boolean invokeInResumeOrPause) {
if(isVisibleToUser) {
lazyLoad();
}
}
}
/**
* @author hush
* on 2016/7/29
* 实现对懒加载的控制
*/
public class FragmentUserVisibleController {
@SuppressWarnings("FieldCanBeLocal")
private boolean waitingShowToUser;
private Fragment fragment;
private UserVisibleCallback userVisibleCallback;
public FragmentUserVisibleController(Fragment fragment, UserVisibleCallback userVisibleCallback) {
this.fragment = fragment;
this.userVisibleCallback = userVisibleCallback;
}
public void activityCreated(){
// 如果自己是显示状态,但父Fragment却是隐藏状态,就把自己也改为隐藏状态,并且设置一个等待显示的标记
if(fragment.getUserVisibleHint()){
Fragment parentFragment = fragment.getParentFragment();
if(parentFragment != null && !parentFragment.getUserVisibleHint()){
userVisibleCallback.setWaitingShowToUser(true);
userVisibleCallback.callSuperSetUserVisibleHint(false);
}
}
}
public void resume(){
if (fragment.getUserVisibleHint()) {
userVisibleCallback.onVisibleToUserChanged(true, true);
}
}
public void pause(){
if (fragment.getUserVisibleHint()) {
userVisibleCallback.onVisibleToUserChanged(false, true);
}
}
public void setUserVisibleHint(boolean isVisibleToUser){
if (fragment.isResumed()) {
userVisibleCallback.onVisibleToUserChanged(isVisibleToUser, false);
}
if(fragment.getActivity() != null) {
List<Fragment> childFragmentList = fragment.getChildFragmentManager().getFragments();
if (isVisibleToUser) {
// 将所有正等待显示的子Fragment设置为显示状态,并取消等待显示标记
if (childFragmentList != null && childFragmentList.size() > 0) {
for (Fragment childFragment : childFragmentList) {
if (childFragment instanceof UserVisibleCallback) {
UserVisibleCallback userVisibleCallback = (UserVisibleCallback) childFragment;
if (userVisibleCallback.isWaitingShowToUser()) {
userVisibleCallback.setWaitingShowToUser(false);
childFragment.setUserVisibleHint(true);
}
}
}
}
} else {
// 将所有正在显示的子Fragment设置为隐藏状态,并设置一个等待显示标记
if (childFragmentList != null && childFragmentList.size() > 0) {
for (Fragment childFragment : childFragmentList) {
if (childFragment instanceof UserVisibleCallback) {
UserVisibleCallback userVisibleCallback = (UserVisibleCallback) childFragment;
if (childFragment.getUserVisibleHint()) {
userVisibleCallback.setWaitingShowToUser(true);
childFragment.setUserVisibleHint(false);
}
}
}
}
}
}
}
/**
* 当前Fragment是否对用户可见
*/
@SuppressWarnings("unused")
public boolean isVisibleToUser(){
return fragment.isResumed() && fragment.getUserVisibleHint();
}
public boolean isWaitingShowToUser() {
return waitingShowToUser;
}
public void setWaitingShowToUser(boolean waitingShowToUser) {
this.waitingShowToUser = waitingShowToUser;
}
public interface UserVisibleCallback {
void setWaitingShowToUser(boolean waitingShowToUser);
boolean isWaitingShowToUser();
boolean isVisibleToUser();
void callSuperSetUserVisibleHint(boolean isVisibleToUser);
void onVisibleToUserChanged(boolean isVisibleToUser, boolean invokeInResumeOrPause);
}
}
fragment数据在lazyLoad里面写就可以了
such as
/**
* @author hush
* on 2016/7/23
* example
*/
public class ExampleFragment extends BasicFragment {
private boolean isPrepared;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
protected void onPostSuccess(String result) {
}
@Override
protected void opPostFailed(String result) {
}
@Override
protected void lazyLoad() {
//zhelixie zheli xie zhelixie
}
}