Android帶進(jìn)度條的文件上傳示例(使用AsyncTask異步任務(wù))
最近項目中要做一個帶進(jìn)度條的上傳文件的功能,學(xué)習(xí)了AsyncTask,使用起來比較方便,將幾個方法實現(xiàn)就行,另外做了一個很簡單的demo,希望能對大家有幫助,在程序中設(shè)好文件路徑和服務(wù)器IP即可。
demo運(yùn)行截圖:


AsyncTask是抽象類,子類必須實現(xiàn)抽象方法doInBackground(Params... p),在此方法中實現(xiàn)任務(wù)的執(zhí)行工作,比如聯(lián)網(wǎng)下載或上傳。AsyncTask定義了三種泛型類型Params,Progress和Result。
1、Params 啟動任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請求的URL,上傳文件的路徑等;
2、Progress 后臺任務(wù)執(zhí)行的百分比;
3、Result 后臺執(zhí)行任務(wù)的最終返回結(jié)果,比如String。
AsyncTask 的執(zhí)行分為四個步驟,與前面定義的TaskListener類似。每一步都對應(yīng)一個回調(diào)方法,需要注意的是這些方法不應(yīng)該由應(yīng)用程序調(diào)用,開發(fā)者需要做的就是實現(xiàn)這些方法。在任務(wù)的執(zhí)行過程中,這些方法被自動調(diào)用。
1、onPreExecute(), 該方法將在執(zhí)行實際的后臺操作前被UI thread調(diào)用。可以在該方法中做一些準(zhǔn)備工作,如在界面上顯示一個進(jìn)度條。
2、doInBackground(Params...), 將在onPreExecute 方法執(zhí)行后馬上執(zhí)行,該方法運(yùn)行在后臺線程中。這里將主要負(fù)責(zé)執(zhí)行那些很耗時的后臺計算工作。可以調(diào)用 publishProgress方法來更新實時的任務(wù)進(jìn)度。該方法是抽象方法,子類必須實現(xiàn)。
3、onProgressUpdate(Progress...),在publishProgress方法被調(diào)用后,UI thread將調(diào)用這個方法從而在界面上展示任務(wù)的進(jìn)展情況,例如通過一個進(jìn)度條進(jìn)行展示。
4、onPostExecute(Result), 在doInBackground 執(zhí)行完成后,onPostExecute 方法將被UI thread調(diào)用,后臺的計算結(jié)果將通過該方法傳遞到UI thread.
主進(jìn)程中使用下面兩行開始異步任務(wù):
mTask = new MyTask(); mTask.execute(filePath, url);
doInBackground()函數(shù)中,params[0]和params[1]本別對應(yīng)execute()的第一個和第二個變量。
private class MyTask extends AsyncTask<String, Integer, String>{
@Override
protected void onPostExecute(String result) {
//最終結(jié)果的顯示
mTvProgress.setText(result);
}
@Override
protected void onPreExecute() {
//開始前的準(zhǔn)備工作
mTvProgress.setText("loading...");
}
@Override
protected void onProgressUpdate(Integer... values) {
//顯示進(jìn)度
mPgBar.setProgress(values[0]);
mTvProgress.setText("loading..." + values[0] + "%");
}
@Override
protected String doInBackground(String... params) {
//這里params[0]和params[1]是execute傳入的兩個參數(shù)
String filePath = params[0];
String uploadUrl = params[1];
//下面即手機(jī)端上傳文件的代碼
String end = "\r\n";
String twoHyphens = "--";
String boundary = "******";
try {
URL url = new URL(uploadUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setConnectTimeout(6*1000);
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
httpURLConnection.setRequestProperty("Charset", "UTF-8");
httpURLConnection.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
DataOutputStream dos = new DataOutputStream(httpURLConnection
.getOutputStream());
dos.writeBytes(twoHyphens + boundary + end);
dos
.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""
+ filePath.substring(filePath.lastIndexOf("/") + 1)
+ "\"" + end);
dos.writeBytes(end);
//獲取文件總大小
FileInputStream fis = new FileInputStream(filePath);
long total = fis.available();
byte[] buffer = new byte[8192]; // 8k
int count = 0;
int length = 0;
while ((count = fis.read(buffer)) != -1) {
dos.write(buffer, 0, count);
//獲取進(jìn)度,調(diào)用publishProgress()
length += count;
publishProgress((int) ((length / (float) total) * 100));
//這里是測試時為了演示進(jìn)度,休眠500毫秒,正常應(yīng)去掉
Thread.sleep(500);
}
fis.close();
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
dos.flush();
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
@SuppressWarnings("unused")
String result = br.readLine();
dos.close();
is.close();
return "上傳成功";
}catch (Exception e) {
e.printStackTrace();
return "上傳失敗";
}
}
界面中只要一個進(jìn)度條progressBar 和一個用于顯示的TextView即可。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android開發(fā)實現(xiàn)ListView點擊item改變顏色功能示例
這篇文章主要介紹了Android開發(fā)實現(xiàn)ListView點擊item改變顏色功能,涉及Android布局及響應(yīng)事件動態(tài)變換元素屬性相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Android自定義帶動畫的半圓環(huán)型進(jìn)度效果
這篇文章主要為大家詳細(xì)介紹了Android自定義帶動畫的半圓環(huán)型進(jìn)度效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Android 線程之自定義帶消息循環(huán)Looper的實例
這篇文章主要介紹了Android 線程之自定義帶消息循環(huán)Looper的實例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10
詳解Android的Splash啟動圖的兩種動態(tài)切換方式
本篇文章主要介紹了詳解Android的Splash啟動圖的兩種動態(tài)切換方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Android通知欄增加快捷開關(guān)的功能實現(xiàn)教程
對于Android來說其中一項很方便的操作便是下拉菜單,下拉菜單欄可以快捷打開某項設(shè)置,這篇文章主要給大家介紹了關(guān)于Android通知欄增加快捷開關(guān)的功能實現(xiàn),需要的朋友可以參考下2023-01-01
利用Jetpack?Compose復(fù)刻游戲Flappy?Bird
Flappy?Bird是13年紅極一時的小游戲,其簡單有趣的玩法和變態(tài)的難度形成了強(qiáng)烈反差,引發(fā)全球玩家競相把玩!本文將通過Jetpack?Compose復(fù)刻這一游戲,感興趣的小伙伴可以了解一下2022-02-02
Android開發(fā)應(yīng)用第一步 安裝及配置模擬器Genymotion
這篇文章主要介紹了Android開發(fā)應(yīng)用第一步,即安裝及配置模擬器Genymotion,感興趣的小伙伴們可以參考一下2015-12-12
Android實現(xiàn)手機(jī)聯(lián)系人分欄效果
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)手機(jī)聯(lián)系人分欄效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
Android RxJava創(chuàng)建操作符Interval
這篇文章主要為大家詳細(xì)介紹了Android RxJava創(chuàng)建操作符Interval的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Android之ProgressBar即時顯示下載進(jìn)度詳解
這篇文章主要為大家詳細(xì)介紹了Android之ProgressBar即時顯示下載進(jìn)度,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09

