? 最近在項目開發(fā)過程中使用到了Volley請求的網(wǎng)絡(luò)框架山憨,其中有一個需求是要批次量的下載更新音頻文件离熏,縱所周知volley不適合下載大文件琼讽,因為volley會 http 傳輸?shù)臄?shù)據(jù)一股腦讀取到內(nèi)存中糠聪,這樣對于下載文件很容易造成oom,在我們的項目需求里邊由于音頻文件只有很小郊艘,只是單詞的發(fā)音大約幾kb的大小玻佩,所以在下載過程中成功實現(xiàn)了出嘹,talk is cheap,show me the code,我們下邊用結(jié)果來說話。
public class ?FileRequest extends Request {
private Response.ListenermListener;
private FileOutputStreamm Output;
private BufferedOutputStreamm BufferedOutput;
private Stringm ContentType;
private Stringm FileName;
public FileRequest(intmethod, String url, Response.Listener listener, Response.ErrorListener errorlistener) {
super(method, url, errorlistener);
mListener= listener;
}
public FileRequest(String url, Response.Listener listener, Response.ErrorListener errorlistener) {
this(Method.POST, url, listener, errorlistener);
}
public String getContentType() {
return mContentType;
}
publicString getFileName() {
return mFileName;
}
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
byte[]data= response.data;
Mapheader= response.headers;
mContentType=header.get("Content-Type");
Stringa=header.get("Content-Disposition");
if(a!=null&&a.length() >=23) {
Strings=header.get("Content-Disposition").substring(22);
mFileName=s.substring(0,s.length() -1);
}else{
mFileName=null;
}
Stringparsed;
try{
//? parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
parsed= ByteToStringUtils.bytesToHexString(data);
}catch(Exception e) {
parsed= ByteToStringUtils.bytesToHexString(data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
protected void deliver Response(String response) {
Log.i("set"," deliverResponse"+ response.toString());
mListener.onResponse(response);
}
}
? 以上是我繼承Volley中的Request類自己封裝的下載音頻文件的庫咬崔,由于項目需求是post方式下載文件税稼,所以在使用的過程中需要自己從response中判斷返回的“Contnet_type”,如果不是則回調(diào)對應(yīng)錯誤的方法,在使用過程中需要自己對流進行讀寫的操作垮斯,和文件的創(chuàng)建郎仆,在自定義下載文件的網(wǎng)絡(luò)請求過程中,對http協(xié)議又有了更深一步的了解兜蠕,也更加了解了volley的內(nèi)部機制扰肌,demo地址github.com/kyle0101/volley