Android帶進(jìn)度條的文件上傳示例(使用AsyncTask異步任務(wù))
最近項(xiàng)目中要做一個(gè)帶進(jìn)度條的上傳文件的功能,學(xué)習(xí)了AsyncTask,使用起來(lái)比較方便,將幾個(gè)方法實(shí)現(xiàn)就行,另外做了一個(gè)很簡(jiǎn)單的demo,希望能對(duì)大家有幫助,在程序中設(shè)好文件路徑和服務(wù)器IP即可。
demo運(yùn)行截圖:
AsyncTask是抽象類(lèi),子類(lèi)必須實(shí)現(xiàn)抽象方法doInBackground(Params... p),在此方法中實(shí)現(xiàn)任務(wù)的執(zhí)行工作,比如聯(lián)網(wǎng)下載或上傳。AsyncTask定義了三種泛型類(lèi)型Params,Progress和Result。
1、Params 啟動(dòng)任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請(qǐng)求的URL,上傳文件的路徑等;
2、Progress 后臺(tái)任務(wù)執(zhí)行的百分比;
3、Result 后臺(tái)執(zhí)行任務(wù)的最終返回結(jié)果,比如String。
AsyncTask 的執(zhí)行分為四個(gè)步驟,與前面定義的TaskListener類(lèi)似。每一步都對(duì)應(yīng)一個(gè)回調(diào)方法,需要注意的是這些方法不應(yīng)該由應(yīng)用程序調(diào)用,開(kāi)發(fā)者需要做的就是實(shí)現(xiàn)這些方法。在任務(wù)的執(zhí)行過(guò)程中,這些方法被自動(dòng)調(diào)用。
1、onPreExecute(), 該方法將在執(zhí)行實(shí)際的后臺(tái)操作前被UI thread調(diào)用。可以在該方法中做一些準(zhǔn)備工作,如在界面上顯示一個(gè)進(jìn)度條。
2、doInBackground(Params...), 將在onPreExecute 方法執(zhí)行后馬上執(zhí)行,該方法運(yùn)行在后臺(tái)線程中。這里將主要負(fù)責(zé)執(zhí)行那些很耗時(shí)的后臺(tái)計(jì)算工作。可以調(diào)用 publishProgress方法來(lái)更新實(shí)時(shí)的任務(wù)進(jìn)度。該方法是抽象方法,子類(lèi)必須實(shí)現(xiàn)。
3、onProgressUpdate(Progress...),在publishProgress方法被調(diào)用后,UI thread將調(diào)用這個(gè)方法從而在界面上展示任務(wù)的進(jìn)展情況,例如通過(guò)一個(gè)進(jìn)度條進(jìn)行展示。
4、onPostExecute(Result), 在doInBackground 執(zhí)行完成后,onPostExecute 方法將被UI thread調(diào)用,后臺(tái)的計(jì)算結(jié)果將通過(guò)該方法傳遞到UI thread.
主進(jìn)程中使用下面兩行開(kāi)始異步任務(wù):
mTask = new MyTask(); mTask.execute(filePath, url);
doInBackground()函數(shù)中,params[0]和params[1]本別對(duì)應(yīng)execute()的第一個(gè)和第二個(gè)變量。
private class MyTask extends AsyncTask<String, Integer, String>{ @Override protected void onPostExecute(String result) { //最終結(jié)果的顯示 mTvProgress.setText(result); } @Override protected void onPreExecute() { //開(kāi)始前的準(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傳入的兩個(gè)參數(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)); //這里是測(cè)試時(shí)為了演示進(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 "上傳失敗"; } }
界面中只要一個(gè)進(jìn)度條progressBar 和一個(gè)用于顯示的TextView即可。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android+json+php+mysql實(shí)現(xiàn)用戶(hù)反饋功能方法解析
相信每個(gè)項(xiàng)目都會(huì)有用戶(hù)反饋建議等功能,這個(gè)實(shí)現(xiàn)的方法很多,下面是我實(shí)現(xiàn)的方法,供大家交流2012-11-11Android編程實(shí)現(xiàn)獲取圖片資源的四種方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)獲取圖片資源的四種方法,分別針對(duì)圖片所在目錄位置分析了Android獲取圖片資源的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11Android實(shí)現(xiàn)基本功能的新聞應(yīng)用
這篇文章主要介紹了一個(gè)簡(jiǎn)易功能的Android新聞應(yīng)用實(shí)現(xiàn)流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12Android實(shí)現(xiàn)將View轉(zhuǎn)化為圖片并保存到本地
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)將View轉(zhuǎn)化為圖片并保存到本地,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Android判斷當(dāng)前App是在前臺(tái)還是在后臺(tái)
這篇文章主要為大家詳細(xì)介紹了Android判斷當(dāng)前App是在前臺(tái)還是在后臺(tái)的方法,感興趣的小伙伴們可以參考一下2016-08-08android使用ItemDecoration給RecyclerView 添加水印
本篇文章主要介紹了android使用ItemDecoration給RecyclerView 添加水印,介紹了自定義Drawable來(lái)完成水印圖片和使用ItemDecoration來(lái)布局水印,有興趣的可以了解一下。2017-02-02