最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android帶進(jìn)度條的文件上傳示例(使用AsyncTask異步任務(wù))

 更新時(shí)間:2016年11月01日 10:30:31   作者:yx0628  
這篇文章主要介紹了Android帶進(jìn)度條的文件上傳示例(使用AsyncTask異步任務(wù)),使用起來(lái)比較方便,將幾個(gè)方法實(shí)現(xiàn)就行,感興趣的小伙伴們可以參考一下。

最近項(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是抽象類,子類必須實(shí)現(xiàn)抽象方法doInBackground(Params... p),在此方法中實(shí)現(xiàn)任務(wù)的執(zhí)行工作,比如聯(lián)網(wǎng)下載或上傳。AsyncTask定義了三種泛型類型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類似。每一步都對(duì)應(yīng)一個(gè)回調(diào)方法,需要注意的是這些方法不應(yīng)該由應(yīng)用程序調(diào)用,開發(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)度。該方法是抽象方法,子類必須實(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)程中使用下面兩行開始異步任務(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() { 
      //開始前的準(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)文章

最新評(píng)論

搜索| 会泽县| 大埔区| 英吉沙县| 浦县| 洛扎县| 古交市| 元氏县| 绵竹市| 陇南市| 苗栗县| 文化| 广宁县| 河源市| 丹阳市| 保山市| 营山县| 黄石市| 甘泉县| 滕州市| 任丘市| 疏勒县| 聂荣县| 长葛市| 鄂伦春自治旗| 台北市| 镇江市| 淮阳县| 赞皇县| 义乌市| 昌平区| 宝山区| 东海县| 黔东| 上高县| 佛山市| 鄄城县| 红河县| 合水县| 聂拉木县| 上饶市|