編輯:關於Android編程
一個線程池中會緩存一定數量的線程,通過線程池就可以避免因為頻繁創建和銷毀線程所帶來的系統開銷。Android中的線程池來源於Java,主要是通過Executor來派生特定類型的線程池。
優點: 1、重用的線程池中的線程,避免因為線程的創建和銷毀所帶來的性能開銷。 2、避免大量的線程間因互相搶占系統資源導致的阻塞現象; 3、能夠對線程進行簡單的管理並提供定時執行,間隔執行等功能;
Android中的線程池來源於Executor,Executor是一個接口,真正線程池實現為ThreadPoolExecutor,通過ThreadPoolExecutor提供的一系列參數來配置線程池,不同參數可以創建不同的線程池。其中Android中常見的四類具有不同功能的線程池為:FixThreadPool、CachedThreadPool、ScheduledThreadPooI、SingThreadExecutor。除了以上四種線程池外,我們可以根據情況自己設置參數自定義線程池。
首先我們先了解一下Android中ThreadPoolExecutor,它的構造方法提供了一系列參數來配置線程池。下面是一個比較常用的構造方法。
corePoolSize:核心線程數,核心線程會一直存活,即使沒有任務需要處理。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性設置為true,那麼閒置的核心線程在等待新任務到來時會有超時策略,這個時間間隔由keepAliveTime所指定,當等待時間超過keepAliveTime所指定的時長後,核心線 程就會被終止。
maximumPoolSize:線程池所能容納的最大線程數,當活動線程數達到這個數值後,後續的新任務將會被阻塞。
keepAliveTime:當線程空閒時間達到keepAliveTime,該線程會退出,直到線程數量等於corePoolSize。如果allowCoreThreadTimeout設置為true,則所有線程均會退出直到線程數量為0。
unit:用於指定keepAliveTime參數的時間單位,這是一個枚舉,常用的有
TimeUnit.MILLISECONDS、TimeUnit.SECOND、TimeUnit.MINUTES。
workQueue:線程池中的任務隊列,通過線程池的execute方法提交的Runnable對象會存儲在這個參數中。
threadFactory:線程工廠,為線程池提供創建新線程的功能。
ThreadPoolExecutor執行任務時大致遵循如下規則 : 1.如果線程池中的數量未達到核心線程的數量,那麼會直接啟動一個核心線程來執行任務。 2.如果線程池中的線程數量已經到或者超過核心線程的數量,那麼任務會被插入到任務隊列中排隊等待執行。 3.如果在步驟2中無法將任務插入到任務隊列中,這往往是由於任務隊列已滿,這個時候如果線程數量未達到線程池規定的最大值,那麼會立刻啟動一個非核心線程來執行。 4.如果步驟3中線程數量已經達到線程池規定的最大值,那麼就拒絕執行此任務,ThreadPoolExecutor會調用RejectedExecutionHandler的rejectedExecution方法來通知調用者。
1、FixedThreadPool:通過Executors的newFixedThreadPool方法來創建。它是一種線程數量固定的線程池,當線程處於空閒狀態時,它們並不會被回收,除非線程池被關閉了。FixedThreadPool中只有核心線程並且這些核心線程沒有超時機制,另外任務隊列也是沒有大小限制的。
程序中調用:
2、CachedThreadPool:它是一種線程數量不定的線程池,最大線程數可以任意大。這類線程池比較適合執行大量的耗時較少的任務。當整個線程池處於閒置狀態時,線程池中的線程都會超時而被停止,這個時候CachedThreadPool之中實際是沒有任何線程的,它幾乎不占用任何系統資源。
程序中調用:
3.ScheduledThreadPool:它的核心線程數量是固定的,而非核心線程數量是沒有限制的,並且當非核心線程閒置時會被立即回收。這類線程池主要用於執行定時任務和具有固定周期的重復任務。
程序中調用:
4、SingleThreadExecutor:它的線程池內部只有一個核心線程,它確保所有的任務都在同一個線程中按順序執行。其意義在於統一所有的外界任務到一個線程中,使得在這些任務之間不需要處理線程同步的問題。
程序中調用:
代碼中的注釋已經詳細講解了線程池的實現方式,在此不再傲述。
添加語音處理能力(Adding Voice Capabilities)語音操作是可穿戴用戶體驗的重要部分,可以讓用戶以快捷、免提的方式執行動作。Wear提供兩種類型的語音
我們使用控件AutoCompleteTextView 自動提示時,有時需要設置BaseAdapter,設置BaseAdapter時,需要實現Filterable,手動進行
在Android實際開發過程中往往會遇到使用v4,v7或v13兼容包中的一些類如ViewPager,Fargment等,但卻無法關聯源碼。 網上有很多解決
ValueAnimator的高級用法在上篇文章中介紹補間動畫缺點的時候有提到過,補間動畫是只能對View對象進行動畫操作的。而屬性動畫就不再受這個限制,它可以對任意對象進