編輯:關於Android編程
在Android裡需要大量後台操作的情況下,經常會使用到AsyncTask這個類,比如說加載網絡圖片,訪問服務器的接口,一般的使用情境就是實例化一個AsyncTask的對象mTask,復寫AsyncTask的抽象方法doinBackgroud等等,最後執行task.execute(params),然後就可以在UI線程上方便的取得後台線程的執行結果;
AsyncTask執行中最終觸發的是把任務交給線池THREAD_POOL_EXECUTOR來執行,提交的任務並行的在線程池中運行,但這些規則在3.0之後發生了變化,3.0之後提交的任務是串行運行的,執行完一個任務才執行下一個!
先看看3.0以前的代碼;
private static final int CORE_POOL_SIZE = 5; private static final int MAXIMUM_POOL_SIZE = 128; private static final int KEEP_ALIVE = 10;
public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
但是在3.0之後,直接調用execute(params)觸發的是sDefaultExecutor的execute(runnable)方法,而不是原來的THREAD_POOL_EXECUTOR
private static final int CORE_POOL_SIZE = CPU_COUNT + 1; private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1; private static final int KEEP_ALIVE = 1;
public static void execute(Runnable runnable) { sDefaultExecutor.execute(runnable); }
看看這個sDefaultExecutor與原來的THREAD_POOL_EXECUTOR線程池有什麼 差別,sDefaultExecutor實際上是指向SerialExecutor的一個實例,從名字上看是一個順序執行的executor;
public static final Executor SERIAL_EXECUTOR = new SerialExecutor(); private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR; private static class SerialExecutor implements Executor { final ArrayDequemTasks = new ArrayDeque (); Runnable mActive; public synchronized void execute(final Runnable r) { mTasks.offer(new Runnable() { public void run() { try { r.run(); } finally { scheduleNext(); } } }); if (mActive == null) { scheduleNext(); } } protected synchronized void scheduleNext() { if ((mActive = mTasks.poll()) != null) { THREAD_POOL_EXECUTOR.execute(mActive); } } }
try { r.run(); } finally { scheduleNext(); }
分析完上面的代碼後,現在對於3.0以後AsyncTask默認情況下同時只存在一個線程順序執行的原理就了解清楚了;
如果想要提交的任務在能並行執行呢?這在網絡圖片顯示中還是比較有用的;
AsyncTask也為我們提供了另外一種啟動方法
public final AsyncTaskexecuteOnExecutor(Executor exec,Params... params)
需求:項目中的有關搜索的地方,加上清空文字的功能,目的是為了增加用戶體驗,使用戶刪除文本更加快捷解決過程:開始的時候感覺這個東西不太好實現,主要就是布局的問題,可能是開始
1.簡介 眾所周知,Android* 開發人員頭頂許多稱呼:設計員、程序猿等,並且通常會不可避免地被稱為故障檢修工。代碼中的錯誤無法避免,因此
通過Intent啟動Activity 為了動態關聯Activity界面,使用Intent啟動,可以靈活綁定。 在Intent靜態
一、基本知識點1、Activity之間傳遞數據1)傳遞基本類型或String intent.putExtra(username, username); getInten