/* * Copyright (c) 2015 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com> * All Rights Reserved. */ package me.zhanghai.android.douya.network; import com.android.volley.Response; import com.android.volley.VolleyError; import me.zhanghai.android.douya.app.TargetedRetainedFragment; /** * <p>Response will only be delivered when this Fragment is in resumed state.</p> * * @param <ResponseType> The type of parsed response the request expects. */ public abstract class RequestFragment<RequestStateType, ResponseType> extends TargetedRetainedFragment implements Response.Listener<ResponseType>, Response.ErrorListener { private boolean mRequesting; private Request<ResponseType> mRequest; private RequestStateType mRequestState; @Override public void onDestroy() { super.onDestroy(); if (mRequest != null) { mRequest.cancel(); mRequesting = false; clearRequest(); } } public boolean isRequesting() { return mRequesting; } public Request<ResponseType> getRequest() { return mRequest; } public RequestStateType getRequestState() { return mRequestState; } protected void start(RequestStateType requestState) { if (mRequesting || shouldIgnoreStartRequest()) { return; } mRequesting = true; mRequest = onCreateRequest(requestState); mRequestState = requestState; mRequest.setListener(this).setErrorListener(this); Volley.getInstance().addToRequestQueue(mRequest); onRequestStarted(); } protected boolean shouldIgnoreStartRequest() { return false; } protected abstract Request<ResponseType> onCreateRequest(RequestStateType requestState); protected abstract void onRequestStarted(); @Override public final void onResponse(ResponseType response) { onVolleyResponse(true, response, null); } @Override public final void onErrorResponse(VolleyError error) { onVolleyResponse(false, null, error); } private void onVolleyResponse(final boolean successful, final ResponseType response, final VolleyError error) { postOnResumed(new Runnable() { @Override public void run() { mRequesting = false; onRequestFinished(successful, mRequestState, response, error); clearRequest(); } }); } private void clearRequest() { mRequest.setListener(null).setErrorListener(null); mRequest = null; mRequestState = null; } protected abstract void onRequestFinished(boolean successful, RequestStateType requestState, ResponseType response, VolleyError error); }