package com.qmusic.volley; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import org.apache.http.HttpEntity; import android.util.Pair; import com.android.volley.NetworkError; import com.android.volley.NetworkResponse; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.loopj.android.http.AsyncHttpClient; public class QMusicFileRequest extends QmusicRequest<HttpEntity> { protected static final int BUFFER_SIZE = 4096; File targetFile; Listener<Pair<Integer, Integer>> listener; public QMusicFileRequest(final int method, final String url, final File targetFile, final Listener<Pair<Integer, Integer>> listener, final ErrorListener errorListener) { super(method, url, new Listener<HttpEntity>() { @Override public void onResponse(HttpEntity response) { listener.onResponse(new Pair<Integer, Integer>(-1, -1)); } }, errorListener); this.listener = listener; this.targetFile = targetFile; setShouldCache(false); } @Override protected Response<HttpEntity> parseNetworkResponse(NetworkResponse response) { if (response instanceof QMusicNetworkResponse) { if (response.statusCode == 200) { writeToFile((QMusicNetworkResponse) response); return Response.success(null, parseCacheHeaders(getUrl(), response)); } else { return Response.error(new NetworkError(response)); } } else { return Response.error(new NetworkError(response)); } } private final void writeToFile(QMusicNetworkResponse qResponse) { if (qResponse.entity != null) { InputStream instream = null; try { instream = qResponse.entity.getContent(); if (instream != null) { long contentLength = qResponse.entity.getContentLength(); FileOutputStream buffer = new FileOutputStream(targetFile); try { byte[] tmp = new byte[BUFFER_SIZE]; int l, count = 0; // do not send messages if request has been cancelled while ((l = instream.read(tmp)) != -1 && !Thread.currentThread().isInterrupted()) { count += l; buffer.write(tmp, 0, l); Pair<Integer, Integer> data = new Pair<Integer, Integer>(count, (int) contentLength); listener.onResponse(data); } } finally { AsyncHttpClient.silentCloseInputStream(instream); buffer.flush(); AsyncHttpClient.silentCloseOutputStream(buffer); } } } catch (Exception ex) { ex.printStackTrace(); } finally { if (instream != null) { try { instream.close(); } catch (Exception ignoreErr) { } } } } } }