asysnctask 內部是執行緒池 + handler的實現方式實現非同步任務。
asynctask有四個核心方法:
onpreexecute()
主線程中執行,執行任務前的一些準備工作可以在此操作
doinbackgroud()
執行緒池中執行
onprogressupdate()
主線程中執行,更新進度
onpostexecute()
主線程中執行,拿到結果,重新整理ui等操作
asynctask具體實現
從入口分析,在初始化asynctask的時候,同時內部初始化了2個類
public
asynctask() catch (throwable tr) finally
return result;}};
mfuture = new futuretask(mworker) catch (interruptedexception e) catch (executionexception e) catch (cancellationexception e) }};
}
乙個是mworker,他是負責執行工作執行緒具體內容的,在子執行緒中被執行,他負責了doinbackground拿到結果,並呼叫postresult()方法,把結果post出去。還有乙個mfuture,他是乙個實現了runnable, future的併發執行類,即執行任務的子執行緒,
當我們執行asynctask的時候會呼叫execute()方法
,execute()又調了executeonexecutor()
方法
public
final asynctaskexecuteonexecutor(executor exec,
params... params)
}mstatus = status.running;
onpreexecute();
mworker.mparams = params;
exec.execute(mfuture);
return
this;
}
可以看出最終開始執行是執行緒池的execute方法,asynctask裡有2個執行緒池,serialexecutor
和threadpoolexecutor
,serialexecutor,而threadpoolexecutor負責執行任務,檢視serialexecutor
原始碼,是可以看出他在執行完乙個任務後呼叫了schedulenext()
方法,而serialexecutor
是靜態的變數,不論多少個asynctask都會共享這個執行緒池,這就導致了使用asynctask執行多個任務時,會序列,而不是並行的。
private
static
class
serialexecutor
implements
executor finally
}});
if (mactive == null)
}protected
synchronized
void
schedulenext()
}}
asynctask.executeonexecutor(asynctask.thread_pool_executor,"");
private
static
class
internalhandler
extends
handler
@suppresswarnings()
@override
public
void
handlemessage(message msg)
}}
Android 開發筆記
版本控制的注意事項 以下資料夾不要加入版本控制 bin bin是編譯的二進位制檔案的存放路徑 gen gen是android需要的資源檔案的原始檔存放的目錄 使用svn的時候要注意專案編譯的問題 在編譯的時候程式會把src資料夾裡面的檔案拷貝到bin裡面,但是svn是每個資料夾裡面都包含乙個隱藏的....
Android開發筆記
1.unable to resolve target android 4 fishjoy final未知android target problem 修改default properties 或者重啟 2.別人的開發筆記 3.真機除錯的時候,一定要下google的usb driver.或者省時省力,...
android開發筆記
1 androidmanifest.xml 解釋 3 meta data標籤使用 4 android.intent.action.main作用 6 頂部滑動導航實現 操作步驟 1 設定好布局檔案,在布局檔案中加入viewpager 2 新建號fragment的布局 3 將fm和viewlist傳入a...