package com.android.volley;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import com.android.volley.error.VolleyError;
import com.android.volley.request.GsonRequest;
import com.android.volley.toolbox.VolleyTickle;
import com.google.gson.Gson;
import org.apache.http.HttpStatus;
/**
* Created by HaKr on 12/08/15.
*/
public class AsyncRequestLoader<T> extends AsyncTaskLoader<T> {
private GsonRequest<T> request;
private VolleyError error;
private T data;
public AsyncRequestLoader(Context context, GsonRequest<T> request) {
super(context);
this.request = request;
}
@Override
public T loadInBackground() {
RequestTickle requestTickle = VolleyTickle.newRequestTickle(getContext());
requestTickle.add(request);
NetworkResponse networkResponse = requestTickle.start();
if (networkResponse.statusCode >= HttpStatus.SC_OK
&& networkResponse.statusCode < 300) {
data = new Gson().fromJson(VolleyTickle.parseResponse(networkResponse), request.getClazz());
}
error = new VolleyError(networkResponse);
return data;
}
@Override
protected void onStartLoading() {
super.onStartLoading();
if (data != null) {
deliverResult(data);
}
if (data == null || takeContentChanged()) {
forceLoad();
}
}
@Override
public void deliverResult(T data) {
if (isReset()) {
if (data != null) {
releaseResources(data);
return;
}
}
T oldData = this.data;
this.data = data;
if (isStarted()) {
super.deliverResult(data);
}
// Invalidate the old data as we don't need it any more.
if (oldData != null && oldData != data) {
releaseResources(oldData);
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
@Override
protected void onReset() {
// Ensure the loader is stopped.
onStopLoading();
if (data != null) {
releaseResources(data);
data = null;
}
}
@Override
public void onCanceled(T data) {
super.onCanceled(data);
releaseResources(data);
request.cancel();
}
private void releaseResources(T data) {
}
public VolleyError getError() {
return error;
}
}