package org.aisen.wen.ui.fragment; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import org.aisen.wen.component.network.biz.IResult; import org.aisen.wen.component.network.task.ITaskManager; import org.aisen.wen.component.network.task.IWorkTask; import org.aisen.wen.component.network.task.TaskException; import org.aisen.wen.component.network.task.TaskManager; import org.aisen.wen.support.utils.Logger; import org.aisen.wen.ui.model.IModel; import org.aisen.wen.ui.model.listener.IModelListener; import org.aisen.wen.ui.model.listener.ModelListenerParam; import org.aisen.wen.ui.presenter.IContentPresenter; import org.aisen.wen.ui.view.IContentView; import java.io.Serializable; /** * 管理好IContentPresenter * * Created by wangdan on 16/10/2. */ public abstract class APresenterFragment<Result extends Serializable, Model extends IModel<Result>, V extends IContentView> extends ABaseFragment implements IContentPresenter<Result, Model, V>, IModelListener<Result>, ITaskManager { private final static String TAG = "ContentPresenterFragment"; private Model mPModel; private V mPView; private final static long DELAY_REQUEST = 500; private TaskManager taskManager;// 管理线程 // UI线程的Handler private Handler mHandler = new Handler(Looper.getMainLooper()) { }; @Override final public Model getPModel() { return mPModel; } @Override final public V getPView() { return mPView; } @Override public void onFinished(ModelListenerParam<Result> param) { if (getView() instanceof IModelListener) { ((IModelListener) getView()).onFinished(param); } onTaskStateChanged(param); } @Override public void onFailure(ModelListenerParam<Result> param) { if (getView() instanceof IModelListener) { ((IModelListener) getView()).onFailure(param); } onTaskStateChanged(param); } @Override public void onSuccess(ModelListenerParam<Result> param) { if (getView() instanceof IModelListener) { ((IModelListener) getView()).onSuccess(param); } Result result = param.getResult(); // 默认加载数据成功,且ContentView有数据展示 getPView().setContentLayout(resultIsEmpty(result)); onTaskStateChanged(param); if (result instanceof IResult) { IResult iResult = (IResult) result; // 数据是缓存数据 if (iResult.fromCache()) { // 缓存过期刷新数据 if (iResult.outofdate()) { runUIRunnable(new Runnable() { @Override public void run() { Logger.d(TAG, "数据过期,开始刷新, " + toString()); requestDataOutofdate(); } }, DELAY_REQUEST); } } } } @Override public void onPrepare(ModelListenerParam<Result> param) { if (getView() instanceof IModelListener) { ((IModelListener) getView()).onPrepare(param); } onTaskStateChanged(param); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPModel = setPresenterModel(); mPView = setPresenterView(); mPView.setPresenter(this); this.taskManager = new TaskManager(); getPModel().setCallback(this); getPView().setBridgeContext(getActivity()); getPView().onBridgeCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View contentView = getPView().onBridgeCreateView(inflater, container, savedInstanceState); if (contentView != null) { getPView().bindView(contentView, savedInstanceState); getPView().bindEvent(contentView, savedInstanceState); contentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); return contentView; } return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getPView().onBridgeActivityCreate(getActivity(), savedInstanceState); if (savedInstanceState != null) { taskManager.restore(savedInstanceState); if (getPView().isContentEmpty()) { requestData(); } else { setContentLayoutVisibility(android.view.View.VISIBLE); setEmptyLayoutVisibility(android.view.View.GONE); setFailureLayoutVisibility(android.view.View.GONE, null); setLoadingLayoutVisibility(android.view.View.GONE); } } else { requestData(); } } @Override public void onStart() { super.onStart(); getPView().onBridgeStart(); } @Override public void onResume() { super.onResume(); getPView().onBridgeResume(); } @Override public void onPause() { super.onPause(); getPView().onBridgePause(); } @Override public void onStop() { super.onStop(); getPView().onBridgeStop(); } @Override public void onDestroy() { super.onDestroy(); removeAllTask(true); getPView().onBridgeDestory(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); taskManager.save(outState); getPView().onBridgeSaveInstanceState(outState); } @Override public View getContentView() { return getPView().getContentView(); } @Override final public int setLayoutId() { return -1; } @Override final public void addTask(IWorkTask task) { taskManager.addTask(task); } @Override final public void removeTask(String taskId, boolean cancelIfRunning) { taskManager.removeTask(taskId, cancelIfRunning); } @Override final public void removeAllTask(boolean cancelIfRunning) { taskManager.removeAllTask(cancelIfRunning); } @Override final public int getTaskCount(String taskId) { return taskManager.getTaskCount(taskId); } @Override final public void clearTaskCount(String taskId) { taskManager.clearTaskCount(taskId); } public void runUIRunnable(Runnable runnable) { runUIRunnable(runnable, 0); } public void runUIRunnable(Runnable runnable, long delay) { if (delay > 0) { mHandler.removeCallbacks(runnable); mHandler.postDelayed(runnable, delay); } else { mHandler.post(runnable); } } /** * Task状态改变时,切换各种View的状态 * */ public void onTaskStateChanged(ModelListenerParam<Result> param) { TaskState state = param.getTaskState(); TaskException exception = param.getException(); // 开始Task if (state == TaskState.prepare) { if (getPView().isContentEmpty()) { setLoadingLayoutVisibility(View.VISIBLE); setContentLayoutVisibility(View.GONE); } else { setLoadingLayoutVisibility(View.GONE); setContentLayoutVisibility(View.VISIBLE); } setEmptyLayoutVisibility(View.GONE); if (getPView().isContentEmpty()) { setFailureLayoutVisibility(View.GONE, null); } } // Task成功 else if (state == TaskState.success) { setLoadingLayoutVisibility(View.GONE); if (getPView().isContentEmpty()) { setEmptyLayoutVisibility(View.VISIBLE); setContentLayoutVisibility(View.GONE); } else { setContentLayoutVisibility(View.VISIBLE); setEmptyLayoutVisibility(View.GONE); } } // Task失败 else if (state == TaskState.falid) { if (getPView().isContentEmpty()) { setFailureLayoutVisibility(View.VISIBLE, exception); setLoadingLayoutVisibility(View.GONE); } } // Task结束 else if (state == TaskState.finished) { } } protected void setLoadingLayoutVisibility(int visibility) { if (getPView().getLoadingLayout() != null) { getPView().getLoadingLayout().setVisibility(visibility); } } protected void setEmptyLayoutVisibility(int visibility) { if (getPView().getEmptyLayout() != null) { getPView().getEmptyLayout().setVisibility(visibility); } } protected void setContentLayoutVisibility(int visibility) { if (getPView().getContentLayout() != null) { getPView().getContentLayout().setVisibility(visibility); } } protected void setFailureLayoutVisibility(int visibility, TaskException e) { if (getPView().getFailureLayout() != null) { getPView().getFailureLayout().setVisibility(visibility); if (e != null) { getPView().setFailureHint(e.getMessage()); } setEmptyLayoutVisibility(View.GONE); } else { setEmptyLayoutVisibility(View.VISIBLE); } } @Override public void requestData() { getPModel().execute(); } /** * 缓存数据失效,重新刷新数据 * */ @Override public void requestDataOutofdate() { requestData(); } public boolean resultIsEmpty(Result result) { return result == null ? true : false; } abstract protected Model setPresenterModel(); abstract protected V setPresenterView(); }