github地址(完整代碼下載地址)
一涡贱、簡(jiǎn)介
??????自己對(duì)OKHttp的封裝的對(duì)多文件上傳践付、下載(帶進(jìn)度值)操作的小的框架全封,可實(shí)現(xiàn)如下功能:<ol>
<li>多文件上傳(帶進(jìn)度值)粘室、表單提交到服務(wù)器榄檬;</li>
<li>同時(shí)提交文件、表單數(shù)據(jù)到服務(wù)器</li>
<li>下載文件保存到到本地(帶進(jìn)度值);</li>
<li>可以在文件上傳/下載時(shí)衔统,在開始鹿榜、結(jié)束、進(jìn)度回調(diào)3個(gè)方法中自定義內(nèi)容锦爵。</li>
</ol>
二舱殿、使用步驟
1、Gradle添加如下2個(gè)依賴
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.zhouxu88:OkHttp3_MultiFile:v1.0'
}
2险掀、多文件上傳的調(diào)用
//多文件上傳(帶進(jìn)度)
private void upload() {
//這個(gè)是非ui線程回調(diào)沪袭,不可直接操作UI
final ProgressListener progressListener = new ProgressListener() {
@Override
public void onProgress(long bytesWrite, long contentLength, boolean done) {
Log.i("TAG", "bytesWrite:" + bytesWrite);
Log.i("TAG", "contentLength" + contentLength);
Log.i("TAG", (100 * bytesWrite) / contentLength + " % done ");
Log.i("TAG", "done:" + done);
Log.i("TAG", "================================");
}
};
//這個(gè)是ui線程回調(diào),可直接操作UI
UIProgressListener uiProgressRequestListener = new UIProgressListener() {
@Override
public void onUIProgress(long bytesWrite, long contentLength, boolean done) {
Log.i("TAG", "bytesWrite:" + bytesWrite);
Log.i("TAG", "contentLength" + contentLength);
Log.i("TAG", (100 * bytesWrite) / contentLength + " % done ");
Log.i("TAG", "done:" + done);
Log.i("TAG", "================================");
//ui層回調(diào),設(shè)置當(dāng)前上傳的進(jìn)度值
int progress = (int) ((100 * bytesWrite) / contentLength);
uploadProgress.setProgress(progress);
uploadTV.setText("上傳進(jìn)度值:" + progress + "%");
}
//上傳開始
@Override
public void onUIStart(long bytesWrite, long contentLength, boolean done) {
super.onUIStart(bytesWrite, contentLength, done);
Toast.makeText(getApplicationContext(),"開始上傳",Toast.LENGTH_SHORT).show();
}
//上傳結(jié)束
@Override
public void onUIFinish(long bytesWrite, long contentLength, boolean done) {
super.onUIFinish(bytesWrite, contentLength, done);
//uploadProgress.setVisibility(View.GONE); //設(shè)置進(jìn)度條不可見
Toast.makeText(getApplicationContext(),"上傳成功",Toast.LENGTH_SHORT).show();
}
};
//開始Post請(qǐng)求,上傳文件
OKHttpUtils.doPostRequest(POST_FILE_URL, initUploadFile(), uiProgressRequestListener, new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
Log.i("TAG", "error------> "+e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "上傳失敗"+e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("TAG", "success---->"+response.body().string());
}
});
}
//初始化上傳文件的數(shù)據(jù)
private List<String> initUploadFile(){
List<String> fileNames = new ArrayList<>();
fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
+ File.separator + "test.txt"); //txt文件
fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
+ File.separator + "bell.png"); //圖片
fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)
+ File.separator + "kobe.mp4"); //視頻
fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
+ File.separator + "xinnian.mp3"); //音樂
return fileNames;
}
3樟氢、文件下載的調(diào)用
//文件下載
private void download() {
//這個(gè)是非ui線程回調(diào)冈绊,不可直接操作UI
final ProgressListener progressResponseListener = new ProgressListener() {
@Override
public void onProgress(long bytesRead, long contentLength, boolean done) {
Log.i("TAG", "bytesRead:" + bytesRead);
Log.i("TAG", "contentLength:" + contentLength);
Log.i("TAG", "done:" + done);
if (contentLength != -1) {
//長(zhǎng)度未知的情況下回返回-1
Log.i("TAG", (100 * bytesRead) / contentLength + "% done");
}
Log.i("TAG", "================================");
}
};
//這個(gè)是ui線程回調(diào),可直接操作UI
final UIProgressListener uiProgressResponseListener = new UIProgressListener() {
@Override
public void onUIProgress(long bytesRead, long contentLength, boolean done) {
Log.i("TAG", "bytesRead:" + bytesRead);
Log.i("TAG", "contentLength:" + contentLength);
Log.i("TAG", "done:" + done);
if (contentLength != -1) {
//長(zhǎng)度未知的情況下回返回-1
Log.i("TAG", (100 * bytesRead) / contentLength + "% done");
}
Log.i("TAG", "================================");
//ui層回調(diào),設(shè)置下載進(jìn)度
int progress = (int) ((100 * bytesRead) / contentLength);
downloadProgress.setProgress(progress);
downloadTv.setText("下載進(jìn)度:" + progress +"%");
}
@Override
public void onUIStart(long bytesRead, long contentLength, boolean done) {
super.onUIStart(bytesRead, contentLength, done);
Toast.makeText(getApplicationContext(),"開始下載",Toast.LENGTH_SHORT).show();
}
@Override
public void onUIFinish(long bytesRead, long contentLength, boolean done) {
super.onUIFinish(bytesRead, contentLength, done);
Toast.makeText(getApplicationContext(),"下載完成",Toast.LENGTH_SHORT).show();
}
};
//開啟文件下載
OKHttpUtils.downloadAndSaveFile(this,DOWNLOAD_TEST_URL,STORE_DOWNLOAD_FILE_PATH,uiProgressResponseListener);
}
備注
文件上傳埠啃、下載中的UIProgressListener 實(shí)現(xiàn)的3個(gè)方法onUIProgress()死宣、onUIStart()、onUIFinish()的內(nèi)容都可以根據(jù)項(xiàng)目需求自定義
三碴开、效果圖
文件上傳毅该、下載.PNG