編輯:關於Android編程
前置內容:Callable、Future、FutureTask
Executor子類的execute方法接收一個Runnable作為參數,會在新線程中執行Runnable中的任務,ScheduledthreadPollExecutor也可以submit任務,參數可以是Runnable或者Callable。Callable可以理解為待返回值的Runnable。FutureTask繼承了Runnable和Future,既有Runnable功能也有Future功能。那麼Executor的execute方法就可以把FutureTask的實例作為參數去執行。
WorkerRunnable是一個抽象類,實現了Callable
mWorker是AsyncTask的一個變量,直接實例化的WorkerRunnable並復寫了Callable的call方法,call方法調用了doInBackground。重要的一點是mWorker是一個Callable對象,而FutureTask可以接收一個Callable對象的實例作為參數。
mFuture是AsyncTask的一個變量,同時是一個FutrueTask對象,接收一個Callable類型的對象作為參數,而mWorker就是一個Callable的一個實例,mFutrue就是將mWorker最為參數實例化的FutureTask的對象。mFuture復寫了done方法,done方法是任務執行完畢後的回調。get方法是獲得FutureTask的運行結果。done方法中調用postResultIfNotInvoked(get())就是將Future的運行結果作為參數調用postResultIfNotInvoked方法。
這樣doInBackground執行的結果就會在done方法的回調中作為參數傳給postResultIfNotInvoked方法。
postResultIfNotInvoked調用了postResult,postResult中調用了getHandler方法。
getHandler方法實例化了一個InternalHandler對象,是個單例。
再來看看InternalHandler,看它的構造,參數是Looper.getMainLooper(),和主線程綁定的Looper,那麼這個Handler發送的消息會被主線程處理(關於Handler的解析,以後會寫一篇關於這這方面的博客,這裡就不解釋Handler相關的東西了)。
再回去看postResult方法,它就是想handler發送了一個消息,Message的what是MESSAGE_POST_RESULT,就會進入InternalHandler的第一個分支。這裡又涉及到了一個內部類AsyncTaskResult,其實就是對Result和AsyncTask對象本身的封裝。
在InternalHandler的handlerMessage方法中調用了result(AsyncTaskResult)對象的mTask(AsyncTask自身)的finish方法。我們再去看finish方法:
這是一篇遲來的博客,Android M已經發布一年多了(6.0的變化),在Android M中權限系統被重新設計,發生了顛覆性的變化,很多人把握不好這個變化,一是對這個權
前言最近我跟自定義View槓上了,甚至說有點上瘾到走火入魔了。身為菜鳥的我自然要查閱大量的資料,學習大神們的代碼,這不,前兩天正好在郭神在微信公眾號裡推送一片自定義控件的
在我們使用手機的時候,由於眼睛需要正對著屏幕,隨著時間的增加,就會引起眼睛疲勞,不適,以及近視等問題,所以我們在使用手機的時候盡量要控制好使用時間,保護好自
1.EditView的自定義樣式其實這部分大家一定不陌生,通常默認的樣式都與我們的設計樣式有出入,那麼就需要我們自定義,通常我們使用Android:background=