<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                #### 1.2.1 AsyncTask [AsyncTask](https://www.androidos.net.cn/android/6.0.1_r16/xref/frameworks/base/core/java/android/os/AsyncTask.java)是一種**輕量級的異步任務類**,它**可以在線程池中執行后臺任務,然后把執行的進度和最終結果傳遞給主線程并在主線程中更新UI**。從實現上來說,**AsyncTask封裝了Thread和Handler,通過AsyncTask可以更加方便地執行后臺任務以及在主線程中訪問UI,但是AsyncTask并不適合進行特別耗時的后臺任務,對于特別耗時的任務來說,建議使用線程池**。 **AsyncTask是一個抽象的泛型類**,它**提供了Params、Progress和Result這三個泛型參數(*注意這里的泛型參數,要記住各自的含義,具體的參數數據類型,具體分析*)**,其中 1. **Params表示參數的類型**, 2. **Progress表示后臺任務的執行進度的類型**, 3. 而**Result則表示后臺任務的返回結果的類型**, **如果AsyncTask確實不需要傳遞具體的參數,那么這三個泛型參數可以用Void來代替**。AsyncTask這個類的聲明如下所示。 ``` public abstract class AsyncTask<Params, Progress, Result>。 ``` ![](https://box.kancloud.cn/2015-12-01_565da6861a2c6.jpg) AsyncTask提供了4個核心方法,它們的含義如下所示。 * (1)`onPreExecute()`,在**主線程中執行**,在**異步任務執行之前,此方法會被調用,一般可以用于做一些準備工作**。 * (2)`doInBackground(Params...params)`,在**線程池中執行**,此方法**用于執行異步任務**,params參數表示異步任務的輸入參數。**在此方法中可以通過publishProgress方法來更新任務的進度,publishProgress方法會調用onProgressUpdate方法。另外此方法需要返回計算結果給onPostExecute方法**。 * (3)`onProgressUpdate(Progress...values`),在**主線程中執行**,**當后臺任務的執行進度發生改變時此方法會被調用**。 * (4)`onPostExecute(Result result)`,在**主線程中執行**,主要**進行UI的更新操作**,在**異步任務執行之后,此方法會被調用**,其中**result參數是后臺任務(doInBackground中進行的異步任務)的返回值,即doInBackground的返回值**。 ![](https://box.kancloud.cn/2015-12-01_565da68711c04.jpg) 上面這幾個方法,onPreExecute先執行,接著是doInBackground,最后才是onPostExecute。除了上述四個方法以外,**AsyncTask還提供了onCancelled()方法,它同樣在主線程中執行,當異步任務被取消時,onCancelled()方法會被調用,這個時候onPostExecute則不會被調用**。下面提供一個典型的示例,如下所示。 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count)*100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } } 在上面的代碼中,**實現了一個具體的AsyncTask類,這個類主要用于模擬文件的下載過程**,它的**輸入參數類型為URL,后臺任務的進程參數為Integer,而后臺任務的返回結果為Long類型**。 注意到doInBackground和onProgressUpdate方法它們的參數中均包含…的字樣,在Java中…表示參數的數量不定(**就是可變參數**),它是一種數組型參數,…的概念和C語言中的…是一致的。當要執行上述下載任務時,可以通過如下方式來完成: ``` new DownloadFilesTask().execute(url1, url2, url3); ``` 在DownloadFilesTask中, * `doInBackground`用來**執行具體的下載任務并通過publishProgress方法來更新下載的進度,同時還要判斷下載任務是否被外界取消了。當下載任務完成后,doInBackground會返回結果,即下載的總字節數**。 需要注意的是,**doInBackground是在線程池中執行的**。 * `onProgressUpdate`用于**更新界面中下載的進度,它運行在主線程,當publishProgress被調用時,此方法就會被調用**。 * 當**下載任務完成后**,**onPostExecute方法就會被調用,它也是運行在主線程中**,這個時候我們**就可以在界面上做出一些提示,比如彈出一個對話框告知用戶下載已經完成**。 AsyncTask在具體的使用過程中也是有一些條件限制的,主要有如下幾點: * (1)**AsyncTask的類必須在主線程中加載**,這就意味著**第一次訪問AsyncTask必須發生在主線程,當然這個過程在Android 4.1及以上版本中已經被系統自動完成**。在Android 5.0的源碼中,可以查看ActivityThread的main方法,它會調用AsyncTask的init方法,這就滿足了**AsyncTask的類必須在主線程中進行加載**這個條件了。至于為什么必須要滿足這個條件,在11.2.2節中會結合AsyncTask的源碼再次分析這個問題。 * (2)**AsyncTask的對象必須在主線程中創建**。 * (3)**execute方法必須在UI線程調用**。 * (4)**不要在程序中直接調用`onPreExecute()`、`onPostExecute`、`doInBackground`和`onProgressUpdate`方法**。 * (5)**一個AsyncTask對象只能執行一次,即只能調用一次execute方法,否則會報運行時異常**。 * (6)在Android 1.6之前,AsyncTask是串行執行任務的,Android 1.6的時候AsyncTask開始采用線程池里處理并行任務,但是從**Android 3.0開始,為了避免AsyncTask所帶來的并發錯誤,AsyncTask又采用一個線程來串行執行任務**。**盡管如此,在Android 3.0以及后續的版本中,我們仍然可以通過AsyncTask的executeOnExecutor方法來并行地執行任務**。 ![](https://box.kancloud.cn/2015-12-01_565da6887ac4b.jpg) #### 參考文章: [Android AsyncTask 源碼解析](https://blog.csdn.net/lmj623565791/article/details/38614699?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159594982819724845029718%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159594982819724845029718&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_v1-1-38614699.pc_v2_rank_blog_v1&utm_term=AsyncTask&spm=1018.2118.3001.4187) [Android AsyncTask完全解析,帶你從源碼的角度徹底理解](https://blog.csdn.net/guolin_blog/article/details/11711405?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159594993219195162550355%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159594993219195162550355&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_v1-1-11711405.pc_v2_rank_blog_v1&utm_term=AsyncTask&spm=1018.2118.3001.4187) [Android ListView異步加載圖片亂序問題,原因分析及解決方案](https://blog.csdn.net/guolin_blog/article/details/45586553?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159595154619195188456825%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159595154619195188456825&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_v1-2-45586553.pc_v2_rank_blog_v1&utm_term=AsyncTask&spm=1018.2118.3001.4187) [Android高效加載大圖、多圖解決方案,有效避免程序OOM](https://blog.csdn.net/guolin_blog/article/details/9316683?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159594993219195162550355%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159594993219195162550355&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_v1-3-9316683.pc_v2_rank_blog_v1&utm_term=AsyncTask&spm=1018.2118.3001.4187) [Android應用程序線程消息循環模型分析](https://blog.csdn.net/Luoshengyang/article/details/6905587?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159595740419724839261754%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159595740419724839261754&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_v1-1-6905587.pc_v2_rank_blog_v1&utm_term=AsyncTask&spm=1018.2118.3001.4187)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看