編輯:關於Android編程
這是Java本身就支持的類,自定義化程度高,但是所有的功能都需要自己維護。
AsyncTask常用於可以在幾秒鐘完成的後台任務,關於AsyncTask的講解可以看這一篇文章http://sparkyuan.me/2016/03/23/AsyncTask源碼剖析(API 23)/ /)
講解了AsyncTask的基本用法和源碼分析。
HandlerThread繼承了Thread,是一種可以使用Handler的Thread,它的實現就是在run方法中通過Looper.prepare()來創建消息隊列,並通過Looper.loop()來開啟消息循環,這樣在實際的使用中就允許在HandlerThread中創建Handler了。外界可以通過Handler的消息方式通知HandlerThread執行一個具體的任務。
HandlerThread的一個應用場景就是用在IntentService中。HandlerThread的run方法是一個無限循環,因此當明確不需要再使用HandlerThread的時候,可以通過它的quit或者quitSafely方法來終止線程的執行,這是一個良好的編程習慣。
IntentService是一個特殊的Service,它繼承自Service並且是個抽象類,要使用它就要創建它的子類。與AsyncTask不同的是,IntentService用於需要長時間執行的任務,因為他是Service,所以他的優先級比單純的線程高很多。
IntentService的onCreate方法中會創建HandlerThread,並使用HandlerThread的Looper來構造一個Handler對象ServiceHandler,這樣通過ServiceHandler對象發送的消息最終都會在HandlerThread中執行。IntentService會將Intent封裝到Message中,通過ServiceHandler發送出去,在ServiceHandler的handleMessage方法中會調用IntentService的抽象方法onHandleIntent,所以IntentService的子類都要是實現這個方法。
public class LocalIntentService extends IntentService {
private static final String TAG = "LocalIntentService";
public LocalIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
String action = intent.getStringExtra("task_action");
Log.d(TAG, "receive task :" + action);
SystemClock.sleep(3000);
if ("com.ryg.action.TASK1".equals(action)) {
Log.d(TAG, "handle task: " + action);
}
}
@Override
public void onDestroy() {
Log.d(TAG, "service destroyed.");
super.onDestroy();
}
}
Intent service = new Intent(this, LocalIntentService.class);
service.putExtra("task_action", "com.sparkyuan.com");
startService(service);
Executor只是一個接口,真正的線程池是ThreadPoolExecutor。ThreadPoolExecutor提供了一系列參數來配置線程池,通過不同的參數可以創建不同的線程池,Android的線程池都是通過Executors提供的工廠方法得到的。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue)
ThreadFactory threadFactory
corePoolSize:核心線程數,默認情況下,核心線程會在線程中一直存活; maximumPoolSize:最大線程數,當活動線程數達到這個數值後,後續的任務將會被阻塞; keepAliveTime:非核心線程閒置時的超時時長,超過這個時長,閒置的非核心線程就會被回收; unit:用於指定keepAliveTime參數的時間單位,有TimeUnit.MILLISECONDS、TimeUnit.SECONDS、TimeUnit.MINUTES等; workQueue:任務隊列,通過線程池的execute方法提交的Runnable對象會存儲在這個參數中; threadFactory:線程工廠,為線程池提供創建新線程的功能。它是一個接口,它只有一個方法Thread newThread(Runnable r); RejectedExecutionHandler:當線程池無法執行新任務時,可能是由於任務隊列已滿或者是無法成功執行任務,這個時候就會調用這個Handler的rejectedExecution方法來通知調用者,默認情況下,rejectedExecution會直接拋出一個rejectedExecutionException。
private void runThreadPool() {
Runnable command = new Runnable() {
@Override
public void run() {
SystemClock.sleep(2000);
}
};
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
fixedThreadPool.execute(command);
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(command);
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
// 2000ms後執行command
scheduledThreadPool.schedule(command, 2000, TimeUnit.MILLISECONDS);
// 延遲10ms後,每隔1000ms執行一次command
scheduledThreadPool.scheduleAtFixedRate(command, 10, 1000, TimeUnit.MILLISECONDS);
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.execute(command);
}
曾在網上找了一些關於CoordinatorLayout的教程,大部分文章都是把CoordinatorLayout、AppbarLayout、CollapsingToolb
一、RxJava概念RxJava官方定義一個在 Java VM 上使用可觀測的序列來組成異步的、基於事件的程序的庫。用一個詞概括:異步,也就是說RxJava也可以理解為一
什麼是RecyclerView關於RecyclerView,是一個主要用於展示和回收View的有一個控件,在官用了一句話來概括RecyclerView 是一種通過提供有限
小米手環2和唯樂now2哪個好?小米手環2准備開放購買了,小編了解到,還有一款唯樂now2可以選擇,如果買不到小米手環2的網友,也可以考慮唯樂手環,那麼小米