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

Android中通過AsyncTask類來制作炫酷進(jìn)度條的實(shí)例教程

 更新時(shí)間:2016年05月06日 17:59:30   作者:ALIOUS  
這篇文章主要介紹了Android中通過AsyncTask來制作炫酷進(jìn)度條的實(shí)例教程,借助AsyncTask類的線程操作方法來管理異步任務(wù),需要的朋友可以參考下

AsyncTask (API level 3,所以幾乎所有目前在市面上流通的 Android 版本皆可使用)
是除 Thread 外的另一種選擇,Android 團(tuán)隊(duì)鼓勵(lì)主執(zhí)行緒(UI thread) 專注于操作 & 畫面的流暢呈現(xiàn),
其余工作 (如網(wǎng)絡(luò)資料傳輸、檔案/磁碟/資料存取) 最好都在背景執(zhí)行;
Thread 通常要搭配 Handler 使用,而 AsyncTask 用意在簡化背景執(zhí)行 thread 程序碼的撰寫。

如果您預(yù)期要執(zhí)行的工作能在幾秒內(nèi)完成,就可以選擇使用 AsyncTask,若執(zhí)行的時(shí)間很長,
Android 則強(qiáng)烈建議采用 Executor, ThreadPoolExecutor and FutureTask。

要使用 AsyncTask,必定要建立一個(gè)繼承自 AsyncTask 的子類別,并傳入 3 項(xiàng)資料:

  • Params -- 要執(zhí)行 doInBackground() 時(shí)傳入的參數(shù),數(shù)量可以不止一個(gè)
  • Progress -- doInBackground() 執(zhí)行過程中回傳給 UI thread 的資料,數(shù)量可以不止一個(gè)
  • Rsesult -- 傳回執(zhí)行結(jié)果

若您沒有參數(shù)要傳入,則填入 Void (注意 V 為大寫)。

AsyncTask 的運(yùn)作有 4 個(gè)階段:

  • onPreExecute -- AsyncTask 執(zhí)行前的準(zhǔn)備工作,例如畫面上顯示進(jìn)度表,
  • doInBackground -- 實(shí)際要執(zhí)行的程序碼就是寫在這里,
  • onProgressUpdate -- 用來顯示目前的進(jìn)度,
  • onPostExecute -- 執(zhí)行完的結(jié)果 - Result 會(huì)傳入這里。

除了 doInBackground,其他 3 個(gè) method 都是在 UI thread 呼叫


炫酷進(jìn)度條實(shí)例
我們以一個(gè)實(shí)例來說明,“點(diǎn)擊按鈕開始下載QQAndroid安裝包,然后顯示一個(gè)對(duì)話框來反饋下載進(jìn)度”。我們先初始化一個(gè)對(duì)話框,由于要顯示進(jìn)度,我們用Github上面一個(gè)能夠顯示百分比的進(jìn)度條 NumberProgressbar,啟動(dòng)任務(wù)的按鈕我們使用 circlebutton,一個(gè)有酷炫動(dòng)畫的按鈕,Github上面有很多非常好的開源項(xiàng)目,當(dāng)然炫酷的控件是其中一部分了,后面有機(jī)會(huì),會(huì)去學(xué)習(xí)一些比較流行的控件它們的實(shí)現(xiàn)原理,今天就暫且拿來主義了~~。

1.先初始化進(jìn)度條提示對(duì)話框。

 builder = new AlertDialog.Builder(
     MainActivity.this);
 LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
 mDialogView = inflater.inflate(R.layout.progress_dialog_layout, null);
 mNumberProgressBar = (NumberProgressBar)mDialogView.findViewById(R.id.number_progress_bar);
 builder.setView(mDialogView);
 mDialog = builder.create();

2.設(shè)置按鈕點(diǎn)擊事件。

 findViewById(R.id.circle_btn).setOnClickListener(new View.OnClickListener(){
   @Override
   public void onClick(View v) {
     dismissDialog();
     mNumberProgressBar.setProgress(0);
     myTask = new MyAsyncTask();
     myTask.execute(qqDownloadUrl);
   }
 });

3.DownloadAsyncTask實(shí)現(xiàn),有點(diǎn)長。

private class DownloadAsyncTask extends AsyncTask<String , Integer, String> {

 @Override
 protected void onPreExecute() {
   super.onPreExecute();
   mDialog.show();

 }

 @Override
 protected void onPostExecute(String aVoid) {
   super.onPostExecute(aVoid);
   dismissDialog();
 }

 @Override
 protected void onProgressUpdate(Integer... values) {
   super.onProgressUpdate(values);

   mNumberProgressBar.setProgress(values[0]);
 }

 @Override
 protected void onCancelled(String aVoid) {
   super.onCancelled(aVoid);
   dismissDialog();
 }

 @Override
 protected void onCancelled() {
   super.onCancelled();
   dismissDialog();
 }

 @Override
 protected String doInBackground(String... params) {
   String urlStr = params[0];
   FileOutputStream output = null;
   try {
     URL url = new URL(urlStr);
     HttpURLConnection connection = (HttpURLConnection)url.openConnection();
     String qqApkFile = "qqApkFile";
     File file = new File(Environment.getExternalStorageDirectory() + "/" + qqApkFile);
     if (file.exists()) {
       file.delete();
     }
     file.createNewFile();
     InputStream input = connection.getInputStream();
     output = new FileOutputStream(file);
     int total = connection.getContentLength();
     if (total <= 0) {
       return null;
     }
     int plus = 0;
     int totalRead = 0;
     byte[] buffer = new byte[4*1024];
     while((plus = input.read(buffer)) != -1){
       output.write(buffer);
       totalRead += plus;
       publishProgress(totalRead * 100 / total);
       if (isCancelled()) {
         break;
       }
     }
     output.flush();
   } catch (MalformedURLException e) {
     e.printStackTrace();
     if (output != null) {
       try {
         output.close();
       } catch (IOException e2) {
         e2.printStackTrace();
       }
     }
   } catch (IOException e) {
     e.printStackTrace();
     if (output != null) {
       try {
         output.close();
       } catch (IOException e2) {
         e2.printStackTrace();
       }
     }
   } finally {
     if (output != null) {
       try {
         output.close();
       } catch (IOException e) {
         e.printStackTrace();
       }
     }
   }
   return null;
 }
}

這樣一個(gè)簡單的下載文件文件就基本實(shí)現(xiàn)了,到目前為止談不上技巧,但是現(xiàn)在我們有一個(gè)問題,就是如果我們的Activity正在后臺(tái)執(zhí)行一個(gè)任務(wù),可能耗時(shí)較長,那用戶可能會(huì)點(diǎn)擊返回退出Activity或者退出App,那么后臺(tái)任務(wù)不會(huì)立即退出,如果AsyncTask內(nèi)部有Activity中成員變量的引用,還會(huì)造成Activity的回收延時(shí),造成一段時(shí)間內(nèi)的內(nèi)存泄露,所以我們需要加上下面的第四步處理。

4.onPause中判斷應(yīng)用是否要退出,從而決定是否取消AsyncTask執(zhí)行。

@Override
protected void onPause() {
 super.onPause();
 if (myTask != null && isFinishing()) {
   myTask.cancel(false);
 }
}

這樣我們的異步任務(wù)就會(huì)在Activity退出時(shí),也隨之取消任務(wù)執(zhí)行,順利被系統(tǒng)銷毀回收,第四步很多時(shí)候會(huì)被遺漏,而且一般也不會(huì)有什么致命的問題,但是一旦出問題了,就很難排查,所以遵循編碼規(guī)范還是有必要的。


相關(guān)文章

  • 利用Android封裝一個(gè)有趣的Loading組件

    利用Android封裝一個(gè)有趣的Loading組件

    這篇文章我們將利用Android封裝一個(gè)可以自定義配置前景色和背景色的Loading組件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-08-08
  • android?studio項(xiàng)目:綁定服務(wù)和線程實(shí)現(xiàn)計(jì)時(shí)器

    android?studio項(xiàng)目:綁定服務(wù)和線程實(shí)現(xiàn)計(jì)時(shí)器

    這篇文章主要介紹了android?studio項(xiàng)目:綁定服務(wù)和線程實(shí)現(xiàn)計(jì)時(shí)器,完成一個(gè)秒表,具備啟停功能,通過綁定服務(wù)實(shí)現(xiàn)功能,通過Thread+handler更新界面,需要的朋友可以參考一下
    2021-12-12
  • AndroidStudio:手勢識(shí)別

    AndroidStudio:手勢識(shí)別

    這篇文章主要介紹了AndroidStudio手勢識(shí)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Android中使用Gradle來構(gòu)建App項(xiàng)目的入門指南

    Android中使用Gradle來構(gòu)建App項(xiàng)目的入門指南

    Gradle是Java世界中一個(gè)高人氣自動(dòng)化構(gòu)建工具,在安卓開發(fā)領(lǐng)域同樣備受追捧,這里為大家?guī)鞟ndroid中使用Gradle來構(gòu)建App項(xiàng)目的入門指南,來看看Gradle的作用與基本結(jié)構(gòu).
    2016-06-06
  • Android基于Flutter編寫文件下載管理器

    Android基于Flutter編寫文件下載管理器

    文件下載在很多類型的應(yīng)用中會(huì)涉及,例如音樂、文檔、包括圖片(只是圖片可以使用一些組件完成無感知的下載)。本篇介紹使用Flutter中的Dio下載方法完成文件的下載,需要的可以參考一下
    2022-03-03
  • Android APP數(shù)字解鎖實(shí)例詳解

    Android APP數(shù)字解鎖實(shí)例詳解

    這篇文章主要介紹了Android 應(yīng)用數(shù)字解鎖實(shí)例詳解的相關(guān)資料,這里附有實(shí)例代碼及實(shí)現(xiàn)效果圖,需要的朋友可以參考下
    2016-11-11
  • Android中RecyclerView實(shí)現(xiàn)商品分類功能

    Android中RecyclerView實(shí)現(xiàn)商品分類功能

    這篇文章主要為大家詳細(xì)介紹了Android中RecyclerView實(shí)現(xiàn)商品分類功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Android ndk獲取手機(jī)內(nèi)部存儲(chǔ)卡的根目錄方法

    Android ndk獲取手機(jī)內(nèi)部存儲(chǔ)卡的根目錄方法

    今天小編就為大家分享一篇Android ndk獲取手機(jī)內(nèi)部存儲(chǔ)卡的根目錄方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • 詳解OkSocket與Android的簡單使用

    詳解OkSocket與Android的簡單使用

    本篇文章主要介紹了詳解OkSocket與Android的簡單使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)

    Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)

    這篇文章主要介紹了Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2016-02-02

最新評(píng)論

洛川县| 莱芜市| 鄂伦春自治旗| 沙河市| 保康县| 嵊泗县| 临潭县| 城步| 石家庄市| 浦北县| 全椒县| 枣强县| 漳浦县| 扶沟县| 正定县| 盐源县| 壶关县| 陈巴尔虎旗| 淮南市| 铁岭市| 和政县| 涿州市| 和林格尔县| 海阳市| 绵竹市| 濮阳县| 松阳县| 成都市| 凤冈县| 金阳县| 通城县| 盐山县| 阆中市| 长子县| 眉山市| 繁峙县| 日土县| 准格尔旗| 微山县| 寻甸| 广水市|