日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Android:AsyncTask

Android:AsyncTask

來源:程序員人生   發布時間:2016-05-09 11:27:35 閱讀次數:2551次

AsyncTask是異步任務,在不阻塞UI線程的情況下,在后臺處理復雜邏輯,并將結果返回到UI線程,現在來分析1下AsyncTask的實現。

先來看看我們常見的使用方法。

先聲明1個類,繼承自AsyncTask

class MyTask extends AsyncTask{ @Override protected Integer doInBackground(Void... params) { // TODO Auto-generated method stub return null; } }
然后使用它


MyTask task; task = new MyTask(); task.execute();
具體AsyncTask都做了甚么,1步步看。在AsyncTask內部有兩個很重要的對象



private final WorkerRunnable mWorker; private final FutureTaskmFuture;
先看看WorkerRunnable



private static abstract class WorkerRunnable implements Callable{ Params[] mParams; }
WorkerRunnable繼承自Callable,Callable的官方說明是:Callable和Runnable類似,都是可以在另外一個線程中履行的,但是2者還是有區分的。


1、Callable的接口方法是call,Runnable是run

2、Callable可以帶返回值,Runnable不行

3、Callable可以捕獲異常,Runnable不行


public interface Callable{ /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception; }
再看看FutureTask,FutureTask是異步計算的結果,繼承關系是 FutureTask -> RunnableFuture->Runnable, Future,FutureTask內部可以判斷任務的履行狀態,并切可以取消任務。


FutureTask的構造函數接收1個Callable類型參數,賦值給callable對象

public FutureTask(Callablecallable) { if (callable == null) throw new NullPointerException(); this.callable = callable; this.state = NEW; // ensure visibility of callable }


上面的WorkerRunnable被傳入,在FutureTask的run方法中,調用WorkerRunnable的call方法履行,并返回結果。

public void run() { ...... try { Callablec = callable; if (c != null && state == NEW) { V result; boolean ran; try { result = c.call(); ran = true; } catch (Throwable ex) { ...... } if (ran) set(result); } } finally { ...... } }

下面就來看看AsyncTask的初始化


public AsyncTask() { mWorker = new WorkerRunnable() { public Result call() throws Exception { ...... } }; mFuture = new FutureTask(mWorker) { @Override protected void done() { ...... } }; }
我們看到,之條件到過的兩個對象,在這里被創建,mFuture實現了done的重載,就是任務完成后,履行此處代碼。當我們履行execute方法是,調用的是下面代碼


public final AsyncTask execute(Params... params) { return executeOnExecutor(sDefaultExecutor, params); } public final AsyncTask executeOnExecutor(Executor exec, Params... params) { if (mStatus != Status.PENDING) { switch (mStatus) { case RUNNING: throw new IllegalStateException("Cannot execute task:" + " the task is already running."); case FINISHED: throw new IllegalStateException("Cannot execute task:" + " the task has already been executed " + "(a task can be executed only once)"); } } mStatus = Status.RUNNING; onPreExecute(); mWorker.mParams = params; exec.execute(mFuture); return this; }
通過 exec.execute(mFuture); 開始履行任務,execute需要Runnable類型對象,mFuture就是FutureTask類型對象,繼承自Runnable。


再看看結果取得后,返回的動作。

FutureTask中的run方法中通過 callable 開始履行任務,任務結束后,會履行set方法

public void run() { ...... try { Callablec = callable; if (c != null && state == NEW) { ...... if (ran) set(result); } } finally { ...... } }
set方法中履行結束任務的方法 finishCompletion,這里就會調用 done 接口,就通知到了AsyncTask的mFuture的done回調


protected void set(V v) { if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { outcome = v; UNSAFE.putOrderedInt(this, stateOffset, NORMAL); // final state finishCompletion(); } }
private void finishCompletion() { // assert state > COMPLETING; ...... done(); callable = null; // to reduce footprint }
mFuture的done回調中會通過postResultIfNotInvoked調用postResult直接提交結果,那末對另外一個對象mWorker來講,在call回調中,通過postResult(doInBackground(mParams));去提交結果,所以 doInBackground 是我們必須實現的1個接口函數。


postResult中通過內部的1個handler,去通知UI進程,并處理 onPostExecute 及 onProgressUpdate 接口的實現。這樣就完成了任務的全部傳遞。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 九九热这里| 国产高清不卡 | 国产麻豆一区二区三区在线观看 | 国产精品18hdxxxⅹ在线 | 亚洲欧洲精品在线 | 成人av免费在线 | 国产精品久久久久国产a级 中文字幕影院 | 国产一区久久 | 美女网站黄免费 | 久久男女视频 | 国产精品久久久久久久久久久久久久 | 一区二区精品视频 | 精品中文字幕一区 | 99在线观看 | 日韩色综合 | 三级三级久久三级久久18 | 美玉足脚交一区二区三区图片 | 国产一区二区三区四区五区tv | 一区二区三区高清在线观看 | 午夜在线免费观看视频 | 一级片在线观看 | av小次郎网站| 欧洲久久久久 | 国产猛男猛女超爽免费视频 | 成人黄色免费看 | 国产精品成人一区二区三区 | 国产一区二区av在线 | 精品久久久一区 | 国产成人精品av | 精品国产乱 | 日韩欧美亚洲国产精品字幕久久久 | 观看av | 亚洲精品电影在线 | 欧美亚洲国产一区 | 在线欧美国产 | 久久不卡 | 日本三级在线视频 | 黑人网站| 天天色图 | 黄色欧美| 国产激情在线视频 |