国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Android - Android的異步任務(wù)AsyncTask詳解

Android的異步任務(wù)AsyncTask詳解

2021-03-28 17:58Android開發(fā)網(wǎng) Android

本文給大家介紹的是Android的異步任務(wù)AsyncTask,在Android中實(shí)現(xiàn)異步任務(wù)機(jī)制有兩種方式,Handler和AsyncTask。今天我們先來主要談下ASYNCTASK。

AsyncTask,顧名思義,異步任務(wù)。說到異步,最簡(jiǎn)單的理解就是不同步。再?gòu)?fù)雜一點(diǎn)理解,就得舉例子了。

假設(shè)我要去火車站買票,剛到火車站我突然發(fā)現(xiàn)我忘了帶身份證。怎么辦?怎么辦!

想辦法,想辦法!我想我應(yīng)該找個(gè)在學(xué)校的同學(xué)幫我送過來,因?yàn)槲也荒茏约夯厝ツ冒。€要排隊(duì)呢,走不開。嗯,要找人送過來。但是問題來了,我找人送身份證了,我去排隊(duì)了,如果排到第一位了身份證還沒到怎么辦?叮,腦袋上面突然亮了一個(gè)小燈泡,機(jī)智的我在排隊(duì)前想到了兩種方案:

第一種方案,讓售票員等著我,我后面隊(duì)伍里買票的人也等著我,我一直在窗口第一位置等著同學(xué)來送身份證,直到,我的身份證被送來,然后順利買票。

另一種方案呢,就是我跟售票員說一下,讓我在一邊等著送身份證,后面的人繼續(xù)買票,等我的身份證送來的時(shí)候我通知下售票員,就可以盡快排到隊(duì)伍第一位(不一定是立即排到第一位,因?yàn)槿f一有人正在買票,我不能過去打斷他)然后買票。

所以呢,選第一種還是第二種?我肯定選第二種,因?yàn)檫x第一種肯定會(huì)被后面排隊(duì)的人罵死,而且還有可能被售票員罵,搞不好還會(huì)挨揍,畢竟因?yàn)槲乙粋€(gè)人,浪費(fèi)了這么多人的時(shí)間,也拖慢了售票員的工作效率。

好了,例子就說到這里。在例子里,第二種方法就是異步的。異步往往和多線程有關(guān),而且異步任務(wù)也大多是交由一個(gè)單獨(dú)的線程完成,然后返回結(jié)果給主線程。這里售票員相當(dāng)于cpu,而排隊(duì)買票的人相當(dāng)于等待被執(zhí)行的任務(wù),而我是個(gè)被標(biāo)記為異步的任務(wù)(因?yàn)槲抑牢規(guī)矸葑C,不能立即買到票,所以排隊(duì)前就想好了第二種方案),當(dāng)cpu執(zhí)行到我這個(gè)任務(wù)的時(shí)候,發(fā)現(xiàn)我這個(gè)任務(wù)可執(zhí)行的條件(身份證)不具備,所以由我發(fā)起了一個(gè)異步任務(wù)(同學(xué)送票),去獲取可執(zhí)行的條件,之后立即把位置讓出來,讓其他排隊(duì)的任務(wù)繼續(xù)執(zhí)行。直到我的身份證拿來,然后立馬通知cpu準(zhǔn)備接待我。

嗯,差不多就是這樣了。開始說正文,android里面的AsyncTask。先上一段官網(wǎng)的引用:

 

復(fù)制代碼 代碼如下:

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

 

是英語(yǔ),雖然我能懂大概是什么意思,但是還是不翻譯了,怕誤人子弟,等我英語(yǔ)學(xué)的再好些再來翻譯吧。不過還是要解釋下大概的意思,就是說AsyncTask可以在UI線程上做一些后臺(tái)操作,也能返回操作結(jié)果到UI線程上。我們知道UI線程是不能做一些耗時(shí)的操作的,但是有了AsyncTask,我們可以這樣做了。但是,

 

復(fù)制代碼 代碼如下:

AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as Executor, ThreadPoolExecutor and FutureTask.

 

對(duì)于耗時(shí)比較久的任務(wù),還是不建議放在AsyncTask中執(zhí)行。AysncTask被設(shè)計(jì)成Thread和Handler的輔助類,并不能執(zhí)行過于復(fù)雜和耗時(shí)的任務(wù),這種任務(wù)應(yīng)該用其他方法這里就不說了。AsyncTask最好用于耗時(shí)最多只有幾秒鐘的操作,比如向網(wǎng)絡(luò)請(qǐng)求個(gè)xml或是json之類的網(wǎng)絡(luò)操作,或是用在程序的初始化界面等等。

下面說下AsyncTask的使用。其實(shí)很簡(jiǎn)單。

首先你需要定義一個(gè)AsyncTask的子類,并且必須重寫父類的doInBackground(Params...)方法。另外還有onPostExecute(Result)方法也可重寫,這個(gè)方法在doInBackground之后被自動(dòng)調(diào)用,所以你可以在這里寫一些任務(wù)完成的通知代碼。

先給一個(gè)官方的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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");
  }
 }

執(zhí)行AsyncTask的時(shí)候,必須在UI線程中執(zhí)行,如下語(yǔ)句。

new DownloadFilesTask().execute(url1, url2, url3);

可以看到,在繼承AsyncTask的時(shí)候,有幾個(gè)泛型類型,如AsyncTask<URL, Integer, Long>,簡(jiǎn)單解釋下。

第一個(gè)可以指定輸入?yún)?shù)的類型,就是new DownloadFilesTask().execute()的參數(shù)(最后傳到了doInBackground),這里的參數(shù)可以不只一個(gè),因?yàn)樽詈蟮椒椒ɡ锩妫盏降氖莻€(gè)數(shù)組。
第二個(gè)可指定發(fā)送進(jìn)度更新需要的類型,一般都是整型,用在publishProgress(用來在后臺(tái)進(jìn)程中發(fā)送進(jìn)度的方法,直接使用的,不用定義)和onProgressUpdate兩個(gè)方法中。
第三個(gè)是AsyncTask返回結(jié)果的數(shù)據(jù)類型,它設(shè)置了doInBackground的返回類型,以及onPostExecute的輸入?yún)?shù)類型
當(dāng)然,如果你什么都不需要,可以都使用Void。

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

另外,還有一個(gè)可以重寫的方法,是onPreExecute(),它在doInBackground之前被調(diào)用,所以如果需要的話,你可以重寫它然后做一些實(shí)例化進(jìn)度條啊之類的工作。

最后,總結(jié)一下:

使用AsyncTask,你要做的是,繼承父類,然后重寫doInBackground(Params...),在里面實(shí)現(xiàn)后臺(tái)操作,如果有返回結(jié)果的話,重寫onPostExecute(Result)然后處理后臺(tái)程序的結(jié)果。

如果需要更新進(jìn)度的話,在onPreExecute()里實(shí)例化進(jìn)度條(也可以不在這),之后在doInBackground(Params...)里面用publishProgress()發(fā)布進(jìn)度值,然后重寫onProgressUpdate(Progress...)接收onPreExecute()發(fā)布的結(jié)果,并添加更新進(jìn)度條的代碼。

以上就是關(guān)于Android中異步任務(wù)的內(nèi)容了,希望大家能夠喜歡。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久久久99啪啪免费 | 国产精品久久久久一区二区三区 | 特级av| 精品综合在线 | 亚洲精品成人天堂一二三 | 天天精品视频免费观看 | 99爱在线观看 | 亚洲第一黄色网 | 中日韩午夜理伦电影免费 | 国产精品日韩一区二区 | 欧美视频在线播放 | 午夜精品久久久久久久久久久久 | 日韩欧美中文字幕一区二区三区 | 亚洲一区二区三区在线视频 | 操操你| 婷婷久久综合 | 成人片免费看 | 久久久999国产 | 国产精品久久久av | 欧美日韩一区免费 | 久久9999| 国产欧美日韩综合精品 | 久久久国产日韩 | 欧美在线一区二区三区 | 国产欧美日韩在线 | 久久久精品一区二区 | 丁香六月av | 日韩三级在线免费观看 | 99国产精品99久久久久久 | 国产高清免费视频 | 亚洲国产一区二区三区四区 | 精品久久一区二区三区 | 国产一区二区三区在线免费观看 | 阿v视频在线观看 | 91综合国产| 黄色电影天堂 | 亚洲免费不卡视频 | 成人欧美一区二区三区白人 | 最新日韩av | 成人精品在线 | 91视频国产精品 |