±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcnblogs£¬ÎÄÕÂÖ÷ÒªÊÇ×÷ÕßÒÔAsyncTaskΪ·¶±¾£¬½éÉÜÁËÁËÒ»¸ö¡°¼ÓÇ¿°æµÄÒì²½ÈÎÎñ¿ò¼Ü¡±¡£ |
|
Ò»¡¢Ç°ÑÔ
ΪÁËÌá¸ßÁ÷³©ÐÔ£¬ºÄʱÈÎÎñ·Åºǫ́Ïß³ÌÔËÐУ¬ÒÑÊÇAPP¿ª·¢µÄ³£Ê¶ÁË¡£
¹ØÓÚÒì²½Óкܶ෽°¸£¬µ±Ç°×îÁ÷Ðеģ¬Äª¹ýÓÚRxJavaÁË£»
¸üÔçһЩʱºò£¬»¹ÓÐAsyncTask£¨¹Ç»Ò¼¶µÄAPI£©¡£
×ܵÄÀ´Ëµ£¬AsyncTask¹¹Ë¼¾«ÇÉ£¬´úÂë¼ò½à£¬Ê¹Ó÷½±ã£¬Óв»Éٵط½ÖµµÃ½è¼ø¡£
µ±È»ÎÊÌâÒ²Óв»ÉÙ£¬±ÈÈç²»ÄÜËæActivityÏú»Ù¶øÏú»Ùµ¼ÖµÄÄÚ´æÐ¹Â©£¬»¹Óв»ÊʺÏ×ö³¤Ê±¼äµÄÈÎÎñµÈ¡£
±ÊÕßÒÔAsyncTaskΪ·¶±¾£¬Ð´ÁËÒ»¸ö¡°¼ÓÇ¿°æµÄÒì²½ÈÎÎñ¿ò¼Ü¡±£º
±£ÁôÁËAsyncTaskµÄËùÓÐÓ÷¨£¬½â¾öÁËÆäÖеÄһЩÎÊÌ⣬ͬʱÒýÈëÁËһЩÐÂÌØÐÔ¡£
½ÓÏÂÀ´¸ø´ó¼Ò½éÉÜÒ»ÏÂÕâ¡°¼ÓÇ¿°æ¡±µÄ¿ò¼Ü£¬Ï£Íû¶Ô¸÷λÓÐËùÆô·¢¡£
¶þ¡¢ÈÎÎñµ÷¶È
2.1 AsyncTaskµÄExecutor
AsyncTaskµÄÈÎÎñµ÷¶ÈÖ÷ÒªÒÀÀµÁ½¸öExecutor£º ThreadPoolExecutor ºÍ
SerialExecutor¡£
´úÂëÈçÏ£º
private static
final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = Math.max(2,
Math.min(CPU_COUNT - 1, 4));
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT
* 2 + 1;
public static final Executor THREAD_POOL_EXECUTOR;
public static final Executor SERIAL_EXECUTOR
= new SerialExecutor();
static {
ThreadPoolExecutor threadPoolExecutor = new
ThreadPoolExecutor(
CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, 30, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(128),
sThreadFactory);
threadPoolExecutor.allowCoreThreadTimeOut(true);
THREAD_POOL_EXECUTOR = threadPoolExecutor;
}
private static class SerialExecutor implements
Executor {
final ArrayDeque<Runnable> mTasks = new
ArrayDeque<Runnable>();
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);
}
}
} |
¹ØÓÚÏ̳߳أ¬¹À¼Æ´ó¼Ò¶¼ºÜÊìϤÁË£¬²ÎÊý¾Í²»¶à×÷½âÊÍÁË¡£
ÉÏÃæ´úÂëÖУ¬Í¨¹ýÇÉÓá°×°ÊÎÕßģʽ¡±£¬Ôö¼Ó¡°´®Ðе÷¶È¡±µÄ¹¦ÄÜ¡£
×°ÊÎÕßģʽÓÐÒÔÏÂÌØµã£º×°ÊζÔÏóºÍÕæÊµ¶ÔÏóÓÐÏàͬµÄ½Ó¿Ú£¬ÕâÑù¿Í»§¶Ë¶ÔÏó¾ÍÄÜÒÔºÍÕæÊµ¶ÔÏóÏàͬµÄ·½Ê½ºÍ×°ÊζÔÏó½»»¥¡£
×°ÊζÔÏó°üº¬Ò»¸öÕæÊµ¶ÔÏóµÄÒýÓá£
×°ÊζÔÏó½ÓÊÜËùÓÐÀ´×Ô¿Í»§¶ËµÄÇëÇó£¬Ëü°ÑÕâЩÇëÇóת·¢¸øÕæÊµµÄ¶ÔÏó¡£
×°ÊζÔÏó¿ÉÒÔÔÚת·¢ÕâЩÇëÇóÒÔǰ»òÒÔºóÔö¼ÓһЩ¸½¼Ó¹¦ÄÜ¡£SerialExecutorÖ»ÓжþÊ®À´ÐдúÂ룬ȴÓÃÁËÁ½´Î×°ÊÎÕßģʽ£ºRunnableºÍExecutor¡£
Runnable²¿·Ö£¬Íù¶ÓÁÐÌí¼ÓµÄÄäÃûRunnable¶ÔÏó£¨×°ÊζÔÏ󣩣¬µ±±»Executorµ÷ÓÃrun()·½·¨Ê±£¬ÏÈÖ´ÐС°ÕæÊµ¶ÔÏó¡±µÄrun()·½·¨£¬È»ºóÔÙµ÷ÓÃscheduleNext()£»
Executor²¿·Ö£¬Í¨¹ýÔö¼ÓÒ»¸öÈÎÎñ¶ÓÁУ¬ÊµÏÖ´®Ðе÷¶ÈµÄ¹¦ÄÜ£¬¶ø¾ßÌåµÄÈÎÎñÖ´ÐÐת·¢¸ø¡°ÕæÊµ¶ÔÏó¡±THREAD_POOL_EXECUTOR¡£
ÏëÒª´®Ðе÷¶È£¬ÎªÊ²Ã´²»¶à¼ÓÒ»¸öcoreSize=1µÄ ThreadPoolExecutorÄØ£¿
Á½¸öThreadPoolExecutor£¬±Ë´ËÏ̲߳»¿É¸´Óá£
ËäÈ»SerialExecutorµÄ·½°¸ºÜ²»´í£¬µ«ÊÇTHREAD_POOL_EXECUTORµÄcoreSize̫СÁË£¨²»³¬¹ý4£©£¬
Õâµ¼ÖÂAsyncTask²»ÊʺÏÖ´Ðг¤Ê±¼äÔËÐеÄÈÎÎñ£¬·ñÔò¶à¼¸¸öÈÎÎñ¾Í»á¶ÂÈû¡£
Òò´Ë£¬Èç¹ûÒª¸Ä½øAsyncTask£¬Ê×ÏÈÒª¸Ä½øExecutor¡£
2.2 ͨÓðæExecutor
ʵÏÖ˼·ºÍ SerialExecutor ²î²»¶à£¬¼ÓÒ»¸ö¶ÓÁÐ, ʵÏÖÁíÒ»²ãµ÷¶È¿ØÖÆ¡£
Ê×ÏÈ£¬°Ñ Runnable ºÍ scheduleNext Á½²¿·Ö¶¼³éÏó³öÀ´£º
interface Trigger
{
fun next()
}
class RunnableWrapper constructor(
private val r: Runnable,
private val trigger: Trigger) : Runnable {
override fun run() {
try {
r.run()
} finally {
trigger.next()
}
}
} |
½ÓÏÂÀ´µÄʵÏÖºÍSerialExecutorÀàËÆ£º
class PipeExecutor
@JvmOverloads constructor(
windowSize: Int,
private val capacity: Int = -1,
private val rejectedHandler: RejectedExecutionHandler
= defaultHandler) : TaskExecutor {
private val tasks = PriorityQueue<RunnableWrapper>()
private val windowSize: Int = if (windowSize
> 0) windowSize else 1
private var count = 0
private val trigger : Trigger = object : Trigger
{
override fun next() {
scheduleNext()
}
}
fun execute(r: Runnable, priority: Int) {
schedule(RunnableWrapper(r, trigger), priority)
}
@Synchronized
internal fun scheduleNext() {
count--
if (count < windowSize) {
startTask(tasks.poll())
}
}
@Synchronized
internal fun schedule(r: RunnableWrapper, priority:
Int) {
if (capacity > 0 && tasks.size()
>= capacity) {
rejectedHandler.rejectedExecution(r, TaskCenter.poolExecutor)
}
if (count < windowSize || priority == Priority.IMMEDIATE)
{
startTask(r)
} else {
tasks.offer(r, priority)
}
}
private fun startTask(active: Runnable?) {
if (active != null) {
count++
TaskCenter.poolExecutor.execute(active)
}
}
} |
½âÎöһϴúÂëÖеIJÎÊýºÍ±äÁ¿£ºtasks£ºÈÎÎñ»º³åÇø
count£ºÕýÔÚÖ´ÐеÄÈÎÎñµÄÊýÁ¿
windowSize£º²¢·¢´°¿Ú£¬¿ØÖÆExecutorµÄ²¢·¢
capacity£ºÈÎÎñ»º³åÇøÈÝÁ¿£¬Ð¡ÓÚµÈÓÚ0ʱΪ²»ÏÞÈÝÁ¿£¬³¬¹ýÈÝÁ¿´¥·¢rejectedHandler
rejectedHandler£ºÄ¬ÈÏΪAbortPolicy£¨Å׳öÒì³££©
priority£ºµ÷¶ÈÓÅÏȼ¶
µ±count>=windowSizeʱ£¬priority¸ßÕßÏȱ»µ÷¶È£»
ÓÅÏȼ¶ÏàͬµÄÈÎÎñ£¬×ñÑÏȽøÏȳö£¨FIFO£©µÄµ÷¶È¹æÔò¡£
ÐèҪעÒâµÄÊÇ£¬µ÷¶ÈÓÅÏȼ¶²»Í¬ÓÚÏß³ÌÓÅÏȼ¶£¬Ïß³ÌÓÅÏȼ¶¸üµ×²ãһЩ¡£
±ÈÈçAsyncTaskµÄdoInBackground()Öо͵÷ÓÃÁË£º
Process.setThreadPriority(Process. THREAD_PRIORITY_BACKGROUND)
Õâ¿ÉÒÔʹµÃºǫ́Ï̵߳ÄÏß³ÌÓÅÏȼ¶µÍÓÚUIÏ̡߳£
ÒÔÏÂÊÇPipeExecutorµÄÁ÷³Ìͼ£º

¶¨ÒåÁËPipeExecutorÁËÖ®ºó£¬ÎÒÃÇ¿ÉÒÔʵÏÖ¶à¸öʵÀý¡£
ÀýÈ磬¿ÉÒÔ·ÂÕÕ RxJava µÄ Schedulers£¬¶¨ÒåÊÊÓÃÓÚ¡°IOÃܼ¯ÐÍ¡±ÈÎÎñºÍ¡°¼ÆËãÃܼ¯ÐÍ¡±ÈÎÎñµÄExecutor¡£
val io = PipeExecutor(20,
512)
val computation = PipeExecutor(Math.min(Math.max(2,
cpuCount), 4), 512) |
Ò²¿ÉÒÔ¶¨Òå´®Ðе÷¶ÈµÄExecutor£º
val single =
PipeExecutor(1) |
²»¹ýÎÒÃDz»½¨Ò鶨ÒåÈ«¾ÖµÄ´®Ðе÷¶ÈExecutor£¬ÒòΪ»áÓÐÏ໥×èÈûµÄ·çÏÕ¡£
µ«ÊÇ¿ÉÒÔ¸ù¾Ý³¡¾°¶¨ÒåרÊôµÄ´®Ðе÷¶ÈExecutor£¬±ÈÈç¸øÈÕÖ¾ÊÕ¼¯´´½¨Ò»¸ö£¬¸øÊý¾ÝÉϱ¨´´½¨Ò»¸ö¡¡
²»Í¬ÊµÀý£¬ÓÌÈ粻ͬµÄË®¹Ü£¬Íùͬһ¸ö³Ø×Ó½øË®£¬¹Ê¶øÃüÃûΪPipeExecutor¡£
2.3 È¥ÖØ°æExecutor
ÎÒÃÇÏîÄ¿ÖУ¬Ò³Ãæ¸üÐÂÓõÄÊÇ¡°·¢²¼¶©ÔÄģʽ¡±£º
Êý¾Ý²ãÓбä¸ü£¬·¢²¼¸üÐÂÏûÏ¢£»
ÉϲãÊÕµ½ÏûÏ¢£¬Òì²½¼ÓÔØÊý¾Ý£¬Ë¢ÐÂÒ³Ãæ¡£
È»ºó¾ÍÅöµ½Ò»¸öÎÊÌ⣺Èô¶Ìʱ¼äÄÚÓжà´ÎÊý¾Ý¸üУ¬¾Í»áÓжà¸öÏûÏ¢·¢ÍùÉϲ㡣
²»×öÌØÊâ´¦Àí£¬¾Í»á¼¸ºõͬʱÆô¶¯¶à¸öÒì²½ÈÎÎñ£¬À˷ѼÆËã×ÊÔ´£»
¶à¸öÏ̶߳Բ¢·¢¶ÁȡͬһÊý¾Ý£¬¶àÏß³ÌÎÊÌâÒ²ËæÖ®¶øÀ´£¬Èô´¦Àí²»ºÃ£¬½á¹û²»¿ÉÔ¤Öª¡£
Óô®ÐÐÖ´ÐÐÆ÷£¿ËùÓÐÈÎÎñ´®Ðеϰ£¬ÎÞ·¨ÀûÓÃÈÎÎñ²¢·¢µÄÓÅÊÆ¡£
ËùÒÔ¾¹ý±È½Ï¶àÖÖ·½°¸£¬×îÖյĽáÂÛÊÇ£º
1¡¢ÈÎÎñ·Ö×飬²»Í¬×é²¢ÐУ¬Í¬×é´®ÐÐ
2¡¢Í¬×éµÄÈÎÎñ£¬Èç¹ûÓÐÈÎÎñÔÚÖ´ÐУ¬×î¶àÖ»ÄÜÓÐÒ»¸öÔڵȴý£¬¶ªÆúºóÃæµÄÈÎÎñ
Ëùν·Ö×飬¾ÍÊǸøÈÎÎñ´òtag, ±ÈÈçË¢ÐÂAÊý¾ÝµÄÈÎÎñ½ÐATask, Ë¢ÐÂBÈÎÎñµÄ½ÐBTask¡£
¹ØÓÚµÚ2µã£¬ÆäʵÓп¼ÂǹýÆäËûһЩ·½°¸£¬±ÈÈçÏÂÃæÁ½¸ö:
È¡ÏûÕýÔÚÖ´ÐеÄÈÎÎñ
Ê×ÏȲ»ÊÇËùÓÐÈÎÎñ¶¼¿ÉÒÔÖжϵģ¬¿ÉÒÔ²»½ÓÊÕÆä½á¹û£¬µ«ÊDz»Ò»¶¨ÄÜÖÐ¶ÏÆäÖ´ÐÐ
¼´Ê¹ÄÜÈ¡Ïû£¨±ÈÈçÖжÏÍøÂçÇëÇ󣩣¬Ò²²»ÊÇ×î¼Ñ·½°¸¡£
±È·½Ëµµ±Ç°Ï̻߳òÐíÒѾ¿ìÒªÏÂÔØÍêÁË£¬ÔÚµÈÒ»»áºóÃæµÄÈÎÎñ¾Í¿ÉÒÔ¶Á»º´æÈ¥½á¹ûÁË£»
ÈÎÎñ2È¡ÏûÈÎÎñ1£¬ÈÎÎñ3È¡ÏûÈÎÎñ2¡¡µÈµ½×îºóÒ»¸öÈÎÎñÖ´ÐУ¬Óû§¿ÉÄÜÒѾ²»ÄÍ·³ÁË¡£Èç¹ûÓÐÈÎÎñÔÚÖ´ÐУ¬¶ªÆúºóÃæµÄÈÎÎñ
±È·½ËµÈÎÎñ1¶ÁÈ¡ÁËÊý¾Ý£¬ÔÚ¼ÆËãµÄʱºò£¬Êý¾ÝÔ´±ä¸ü£¬È»ºó·¢ËÍʼþ£¬Æô¶¯ÈÎÎñ2¡¡
Ö±½Ó¶ªÆúºóÃæµÄÈÎÎñ£¬×îÖÕÒ³ÃæÏÔʾµÄÊǾɵÄÊý¾Ý¡£
ÎÒÃǶ¨ÒåÁËÒ»¸öLaneExecutorÀ´ÊµÏÖÕâ¸ö·½°¸£¬Ê¾ÒâͼÈçÏ£º

discard=true
¸÷×éÈÎÎñ¾ÍÏñÒ»¸ö¸ö³µµÀ£¨Lane£©, ¹Ê¶øÃüÃûΪLaneExecutor¡£
Ñó´ÐËÆµØÒ»²ã°üÒ»²ã£¬ºÜÃ÷ÏÔ£¬Ò²ÊÇ×°ÊÎÕßģʽ¡£
Ö°Ôð·ÖÅ䣺
LaneExecutor¸ºÔðÈÎÎñÈ¥ÖØ£»
PipeExecutor¸ºÔðÈÎÎñ²¢·¢¿ØÖƺ͵÷¶ÈÓÅÏȼ¶£»
ThreadPoolExecutor¸ºÔð·ÖÅäÏß³ÌÀ´Ö´ÐÐÈÎÎñ¡£
µ«ºóÀ´ÓÖÓöµ½ÁíÒ»¸öÎÊÌ⣺
Óжà¸ö¿Ø¼þÒª¼ÓÔØÍ¬Ò»¸öURLµÄÊý¾Ý£¬È»ºóºÜ×ÔÈ»µØÎÒÃǾÍÒÔ URL×÷ΪtagÁË£¬ÒÔ±ÜÃâÖØ¸´ÏÂÔØ£¨×öÓлº´æ£¬µÚÒ»ÈÎÎñÏÂÔØÍê³ÉÖ®ºó£¬ºóÃæµÄÈÎÎñ¿ÉÒÔ¶ÁÈ¡»º´æ£©¡£
µ«ÊÇÓÃLaneExecutorÀ´Ö´ÐÐʱ£¬Ö»±£ÁôÒ»¸öÈÎÎñÔڵȴý£¬È»ºó×îÖÕÖ»ÓÐÁ½¸ö¿Ø¼þÄÜÏÔʾÊý¾Ý¡£
²éµ½ÎÊÌâºó£¬±ÊÕ߸øLaneExecutor¼ÓÁËÒ»ÖÖģʽ£¬¸ÃģʽÏ£¬²»¶ªÆúÈÎÎñ¡£

discard=false
Èç´Ë£¬ËùÓÐÈÎÎñ¶¼»á±»Ö´ÐУ¬µ«ÊÇÖ»ÓеÚÒ»¸öÐèÒªÏÂÔØÊý¾Ý£¬ºóÃæÈÎÎñ¶Á»º´æ¾ÍºÃÁË¡£
2.4 ͳһ¹ÜÀíExecutor
µ±ÏîÄ¿¸´ÔӶȵ½ÁËÒ»¶¨³Ì¶È£¬Èç¹ûûÓÐͳһµÄ¹«¹²¶¨Ò壬¿ÉÄÜ»á³öÏÖ¸÷ÖÖÈßÓàʵÀý¡£
·ÖÉ¢µÄExecutorÎÞ·¨½ÏºÃµØ¿ØÖƲ¢·¢£»
Èç¹û¸÷×Ô´´½¨µÄÊÇThreadPoolExecutor£¬Ôò»¹Òª¼ÓÉÏÒ»Ìõ£º½µµÍÏ̸߳´Óá£
¹Ê´Ë£¬¿ÉÒÔ¼¯Öж¨ÒåExecutor£¬¸÷Ä£¿éͳһµ÷Óá£
´úÂëÈçÏ£º
object TaskCenter
{
internal val poolExecutor: ThreadPoolExecutor
= ThreadPoolExecutor(
0, 256,
60L, TimeUnit.SECONDS,
SynchronousQueue(),
threadFactory)
// ³£¹æµÄÈÎÎñµ÷¶ÈÆ÷£¬¿É¿ØÖÆÈÎÎñ²¢·¢£¬Ö§³ÖÈÎÎñÓÅÏȼ¶
val io = PipeExecutor(20, 512)
val computation = PipeExecutor(Math.min(Math.max(2,
cpuCount), 4), 512)
// ´øÈ¥ÖزßÂ﵀ Executor£¬¿ÉÓÃÓÚÊý¾ÝˢеÈÈÎÎñ
val laneIO = LaneExecutor(io, true)
val laneCP = LaneExecutor(computation, true)
// ÏàͬµÄtagµÄÈÎÎñ»á±»´®ÐÐÖ´ÐУ¬Ï൱ÓÚ´®ÐеÄExecutor
// ¿ÉÓÃÓÚдÈÕÖ¾£¬Éϱ¨Í³¼ÆÐÅÏ¢µÈÈÎÎñ
val serial = LaneExecutor(PipeExecutor(Math.min(Math.max(2,
cpuCount), 4), 1024))
} |
2.5 ExecutorµÄʹÓÃ
TaskCenter.io.execute{
// do something
}
TaskCenter.laneIO.execute("laneIO",
{
// do something
}, Priority.HIGH)
val serialExecutor = PipeExecutor(1)
serialExecutor.execute{
// do something
}
TaskCenter.serial.execute ("your tag",
{
// do something
}) |
PipeExecutorµÄʹÓúͳ£¹æµÄExecutorÊÇÒ»ÑùµÄ£¬executeÖд«ÈëRunnable¼´¿É£¬
È»ºóÓÉÓÚRunnableÖ»ÓÐÒ»¸ö·½·¨£¬Ò²Ã»ÓвÎÊý£¬lambdaµÄÐÎʽ¾ÍÏԵøü¼Ó¼ò½àÁË¡£
LaneExecutorÓÉÓÚÒª¸øÈÎÎñ´òtag, ËùÒÔÒª´«Èëtag²ÎÊý£»
Èç¹û²»´«£¬ÔòûÓзÖ×éµÄЧ¹û£¬Ò²¾ÍÊÇ»ØÍ˵½PipeExecutorµÄÌØÐÔ£»
Á½ÖÖExecutor¶¼¿ÉÒÔ´«ÈëÓÅÏȼ¶¡£
ºÜ¶à¿ªÔ´ÏîÄ¿¶¼Éè¼ÆÁËAPIÀ´Ê¹ÓÃÍⲿµÄExecutor£¬±ÈÈçRxJava¿ÉÒÔÕâÑùÓãº
object TaskSchedulers
{
val io: Scheduler by lazy { Schedulers.from(TaskCenter.io)
}
val computation: Scheduler by lazy { Schedulers.from(TaskCenter.computation)
}
val single by lazy { Schedulers.from(PipeExecutor(1))
}
} |
Observable.range(1,
8)
.subscribeOn(TaskSchedulers.computation)
.subscribe { Log.d(tag, "number:$it")
} |
ÕâÑùÓÐÒ»¸öºÃ´¦£¬¸÷ÖÖÈÎÎñ¶¼ÔÚÒ»¸öÏ̳߳ØÉÏÖ´ÐÐÈÎÎñ£¬¿É¸´Óñ˴˴´½¨µÄÏ̡߳£
Èý¡¢Á÷³Ì¿ØÖÆ
3.1 AsyncTaskµÄÖ´ÐÐÁ÷
ÉÏÒ»ÕÂÎÒÃÇ·ÖÎöÁËÈÎÎñµ÷¶È£¬¹¹ÔìÁËһϵÁÐExecutor£¬ÔöÇ¿ÈÎÎñ´¦Àí·½ÃæµÄͨÓÃÐÔ¡£
²»¹ýÈÎÎñµ÷¶ÈÖ»ÊÇAsyncTaskµÄÒ»²¿·Ö£¬AsyncTaskµÄ¾«ËèÆäʵÔÚÓÚÁ÷³Ì¿ØÖÆ£ºÔÚÈÎÎñÖ´ÐеIJ»Í¬½×¶Î£¬»Øµ÷ÏàÓ¦µÄ·½·¨¡£
ÏÂÃæÊÇAsyncTaskµÄÁ÷³Ìͼ£º

ͨ¹ýʹÓÃFutureTaskºÍCallable£¬Ê¹µÃAsyncTask¾ß±¸¶ÔÈÎÎñÖ´ÐиüÇ¿µÄ¿ØÖÆÁ¦£¬±ÈÈçcancelÈÎÎñ¡£
ÓеÄÎÄÕÂ˵cancel()²»Ò»¶¨µÄÁ¢¼´ÖжÏÈÎÎñ£¬µ«ÆäʵFuturet.cancel()ȷʵÒѾÊÇ×îºÃµÄ·½°¸ÁË£¬
Èç¹ûÇ¿Ðе÷ÓÃThread.stop()£¬ÔòÓÌÈç¹Øµô¿ÕÖзɻúµÄÒýÇæ£¬ºó¹û²»¿°ÉèÏë¡£
ͨ¹ýÓëHandlerµÄÅäºÏ£¬AsyncTask¿ÉÒÔÔÚÈÎÎñÖ´Ðйý³ÌÖкÍÖ´ÐнáÊøºó·¢²¼Êý¾Ýµ½UIỊ̈߳¬
ÕâʹµÃAsyncTaskÓÈÆäÊÊÓÃÓÚ¡°Êý¾Ý¼ÓÔØ+½çÃæË¢Ð¡±µÄ³¡¾°¡£
¶øÕâÀೡ¾°ÔÚAPP¿ª·¢ÖнÏΪ³£¼û£¬ÕâÒ²ÊÇAsyncTaskÒ»¶È±»¹ã·ºÊ¹ÓõÄÔÒòÖ®Ò»¡£
3.2 ÉúÃüÖÜÆÚ
AsyncTaskÆäÖÐÒ»¸ö¹ãΪڸ²¡µÄÎÊÌâ¾ÍÊÇÄÚ´æÐ¹Â©£º
ÈôAsyncTask³ÖÓÐActivityÒýÓã¬ÇÒÉúÃüÖÜÆÚ±ÈActivityµÄ³¤£¬ÔòActivityÎÞ·¨±»¼°Ê±»ØÊÕ¡£
Õâ¸öÎÊÌâÆäʵ²»ÊÇAsyncTask¶ÀÓУ¬Handler£¬RxJavaµÈ¶¼´æÔÚÀàËÆÎÊÌâ¡£
½â¾ö·½°¸ÓжàÖÖ£¬¾²Ì¬Àà¡¢ÈõÒýÓá¢ActivityÏú»ÙʱȡÏûµÈ¡£
RxJavaÌṩÁËdispose·½·¨À´È¡ÏûÈÎÎñ£¬Í¬Ê±Ò²Óкܶ༯³ÉÉúÃüÖÜÆÚµÄ¿ªÔ´·½°¸£¬±ÈÈçRxLifecycle¡¢AutoDisposeµÈ¡£
AsyncTaskÒ²ÌṩÁËcancel·½·¨£¬µ«ÊDZȽÏÃü¿à£¬Í²ÛÕßÖÚ£¬ÖúÁ¦Õ߹ѡ£
ÆäʵҪʵÏÖ×Ô¶¯cancel²»ÄÑ£¬½¨Á¢ºÍActivity/FragmentµÄ¹ØÏµ¼´¿É£¬¿Éͨ¹ý¹Û²ìÕßģʽÀ´ÊµÏÖ¡£

UITaskÊDzο¼AsyncTaskдµÄÒ»¸öÀà, ʹÓÃÁËÉÏÒ»Õ½éÉܵÄExecutor¡£
½á¹¹ÉÏ£¬UITaskΪ¹Û²ìÕߣ¬Activity/FragmentΪ±»¹Û²ìÕߣ¬LifecycleManagerΪ
UITask ºÍ Activity/Fragment ¹¹½¨¹ØÏµµÄÇÅÁº¡£
ʵÏÖÉÏÐèÒªÁ½¸öÊý¾Ý½á¹¹£ºÒ»¸öSparseArray£¬Ò»¸öList¡£
SparseArrayµÄkeyΪ±»¹Û²ìÕßµÄidentityHashCode£¬ valueΪ¹Û²ìÕßÁÐ±í¡£
UITaskÌṩÁËhost()·½·¨£¬·½·¨ÖлñÈ¡ËÞÖ÷(Ò²¾ÍÊÇActivity/Fragment)µÄidentityHashCode£¬
ͨ¹ýregister()·½·¨£¬Ìí¼Ó ¡°Activity->UITask¡±
µ½SparseArrayÖС£
abstract class
UITask<Params, Progress, Result> : LifeListener
{
fun host(host: Any): UITask<Params, Progress,
Result> {
LifecycleManager.register(System.identityHashCode(host),
this)
return this
}
override fun onEvent(event: Int) {
if (event == LifeEvent.DESTROY) {
cancel(true)
} else if (event == LifeEvent.SHOW) {
changePriority(+1)
} else if (event == LifeEvent.HIDE) {
changePriority(-1)
}
}
} |
override fun
onCreate(savedInstanceState: Bundle?) {
TestTask().host(this).execute("hello")
} |
ÐèÒªÔÚBaseActivityÖÐ֪ͨʼþ£º
abstract class
BaseActivity : Activity() {
override fun onDestroy() {
super.onDestroy()
LifecycleManager.notify(this, LifeEvent.DESTROY)
}
override fun onPause() {
super.onPause()
LifecycleManager.notify(this, LifeEvent.HIDE)
}
override fun onResume() {
super.onResume()
LifecycleManager.notify(this, LifeEvent.SHOW)
}
} |
µ÷ÓÃnotify()·½·¨Ê±£¬»á¸ù¾ÝActivityË÷Òýµ½¶ÔÓ¦¹Û²ìÕßÁÐ±í£¬È»ºó±éÀúÁÐ±í£¬»Øµ÷¹Û²ìÕßonEvent()·½·¨¡£
ÆäÖУ¬µ±Í¨ÖªµÄʼþΪDESTROYʱ£¬UITaskÖ´ÐÐcancel()·½·¨£¬´Ó¶øÈ¡ÏûÈÎÎñ¡£
3.3 ¶¯Ì¬µ÷ÕûÓÅÏȼ¶
ÉÏÒ»½Ú£¬ÎÒÃÇ¿´µ½UITask³ýÁ˹Ø×¢DESTROYʼþ£¬»¹¹Ø×¢ Activity/Fragment
µÄHIDEºÍSHOW,
²¢¸ù¾Ý¿É¼û״̬µ÷ÕûÓÅÏȼ¶¡£
µ÷ÕûÓÅÏȼ¶ÓÐʲôÓÃÄØ£¿ ÏÂÃæÏÈ¿´Á½ÕÅͼ¸ÐÊÜһϡ£
ΪÁË͹ÏÔЧ¹û£¬ÎÒÃǰѼÓÔØÈÎÎñµÄ²¢·¢Á¿¿ØÖÆÎª1£¨´®ÐУ©¡£
µÚÒ»ÕÅÊDz»»á×Ô¶¯µ÷ÕûÓÅÏȼ¶µÄ£¬ÍêÈ«µÄÏȽøÏȳö£º

²»¸Ä±äÓÅÏȼ¶
¿ÉÒÔ¿´µ½£¬Çл»µ½µÚ¶þ¸öÒ³Ãæ£¬ÓÉÓÚÉÏÒ»Ò³µÄÈÎÎñ»¹Ã»Ö´ÐÐÍ꣬
ËùÒÔÒªÒ»Ö±µÈµ½ÉÏÒ»Ò³µÄÈÎÎñ¶¼Íê³ÉÁ˲ÅÂÖµ½µÚ¶þ¸öÒ³Ãæ¼ÓÔØ¡£
ºÜÏÔÈ»ÕâÑùÌåÑ鲻̫ºÃ¡£
½ÓÏÂÀ´ÎÒÃÇ¿´Ï¶¯Ì¬µ÷ÕûÓÅÏȼ¶ÊÇʲôЧ¹û£º

¶¯Ì¬µ÷ÕûÓÅÏȼ¶
Çл»µ½µÚ¶þ¸öÒ³ÃæÖ®ºó£¬µÚÒ»¸öÒ³ÃæµÄÈÎÎñµÄ¡°µ÷¶ÈÓÅÏȼ¶¡±±»½µµÍÁË£¬ËùÒÔ»áÓÅÏȼÓÔØµÚ¶þ¸öÒ³ÃæµÄͼƬ£»
ÔÙ´ÎÇл»»ØµÚÒ»¸öÒ³Ãæ£¬µÚ¶þ¸öÒ³ÃæµÄÓÅÏȼ¶±»½µµÍ£¬µÚÒ»¸öÒ³ÃæµÄÓÅÏȼ¶»Ö¸´£¬ËùÒÔÓÅÏȼÓÔØµÚÒ»¸öÒ³ÃæµÄͼƬ¡£
Äǿɷñ½øÈëµÚ¶þ¸öÒ³ÃæµÄʱÔÝÍ£µÚÒ»¸öÒ³ÃæµÄÈÎÎñ£¿
ÔÝÍ£µÄ·½°¸²»Ì«ÓѺ㬱ȷ½ËµÓû§ÔÚµÚ¶þ¸öÒ³ÃæÍ£ÁôºÜ¾Ã£¬µÚ¶þ¸öÒ³ÃæµÄÈÎÎñ¶¼Íê³ÉÁË£¬È»ºóÇл»»ØµÚÒ»¸öÒ³Ãæ£¬·¢ÏÖÖ»Óв¿·ÖͼƬ£¨ÆäËû±»ÔÝÍ£ÁË£©¡£
¶øÈç¹ûÖ»Êǵ÷ÕûÓÅÏȼ¶£¬ÔòµÚ¶þ¸öÒ³ÃæµÄÈÎÎñ¶¼Ö´ÐÐÍêÖ®ºó£¬»á½Ó×ÅÖ´ÐеÚÒ»¸öÒ³ÃæµÄÈÎÎñ£¬·µ»ØµÚÒ»¸öÒ³ÃæÊ±¾ÍÄܹ»¿´µ½ËùÓÐͼƬÁË¡£
Õâ¾ÍºÃ±È¸Ï³µ£¬ÈÃÆäËûÈ˸ø²å¸ö¶Ó£¬Ã»ÓÐÎÊÌ⣬µ«ÊDz»Äܲ»¸ø±ðÈËÅŶÓÁ˰ɡ£
3.4 Á´Ê½µ÷ÓÃ
UITaskµÄÓ÷¨ºÍAsyncTask´óͬСÒ죬»Øµ÷·½·¨ºÍ²ÎÊý·ºÐͶ¼ÊÇÒ»ÑùµÄ£¬ËùÒԾͲ»¶à×÷½éÉÜÁË¡£
Èç½ñºÜ¶à¿ªÔ´¿â¶¼ÌṩÁËÁ´Ê½API£¬Ê¹ÓÃÆðÀ´È·ÊµÁé»î·½±ã£¬ÊÓ¾õÉÏÒ²±È½ÏÁ¬¹á¡£
ϲ»¶±ùÌǺù«һÑùµÄÁ´Ê½µ÷Óã¿
ÎÒÃÇÌṩÁËÒ»¸öChainTaskÀà£¬ÍØÕ¹ÁËUITask£¬ÌṩÁ´Ê½µ÷ÓõÄAPI¡£
override fun
onCreate(savedInstanceState: Bundle?) {
val task = ChainTask<Double, Int, String>()
task.tag("ChainTest")
.preExecute { result_tv.text = "running"
}
.background { params ->
for (i in 0..100 step 2) {
// do something
task.publishProgress(i)
} "result is£º" + (params[0] * 100)
}
.progressUpdate { values ->
val progress = values[0]
progress_bar.progress = progress
progress_tv.text = "$progress%"
}
.postExecute { result_tv.text = it }
.cancel { showTips("ChainTask cancel")
}
.priority(Priority.IMMEDIATE)
.host(this)
.execute(3.14)
} |
ËÄ¡¢×ܽá
ËùÒÔ£¬Õâ¸ö¡°¼ÓÇ¿°æÒì²½ÈÎÎñ¿ò¼Ü¡±£¬¶¼×öÄÄЩ·½ÃæµÄ¼ÓÇ¿ÄØ£¿
1¡¢¸üÁé»îµÄ²¢·¢¿ØÖÆ
2¡¢Ö§³Öµ÷¶ÈÓÅÏȼ¶
3¡¢Ö§³ÖÈÎÎñÈ¥ÖØ
4¡¢Ö§³ÖÉúÃüÖÜÆÚ£¨onDestroyʱȡÏûÈÎÎñ£¬×Ô¶¯µ÷ÕûÓÅÏȼ¶£©
5¡¢Ö§³ÖÁ´Ê½µ÷ÓÃ
×îºó£¬¿ÉÄÜ»áÕâÑùµÄÒÉÎÊ£º
¼ÈÈ»ÒѾÓÐ RxJava ÕâÑùºÃÓõĿªÔ´¿âÀ´ÊµÏÖÒì²½ÁË, Ϊʲô»¹ÒªÐ´Õâ¸öÏîÄ¿ÄØ£¿
Ê×ÏÈ£¬RxJava ²»½ö½öÊÇÒì²½¶øÒÑ£º¡°ReactiveXÊÇÒ»¸öͨ¹ýʹÓÿɹ۲ìÐòÁÐÀ´±àдÒì²½ºÍ»ùÓÚʼþµÄ³ÌÐòµÄ¿â¡£¡±
¡°¿É¹Û²ìÐòÁÐ - ʼþ - Òì²½¡±¼ÓÆðÀ´²ÅʹµÃ RxJava Èç´Ë¸»ÓÐ÷ÈÁ¦¡£
ÓÐËùµÃ£¬±ØÓÐËù¸¶³ö£¬ÎªÁËʵÏÖÕâЩ·á¸»µÄÌØÐÔ£¬´úÂëÁ¿Ò²ÊDZȽϿɹ۵썵±Ç°°æ±¾jar°üÔ¼2.2M£©¡£
AsyncTaskÔò±È½Ï¼òµ¥£¬³ýÈ¥×¢ÊÍÖ»ÓÐÈý°Ù¶àÐдúÂ룻
¹¦ÄÜÒ²±È½Ï´¿´â£ºÖ´ÐÐÒì²½ÈÎÎñ£¬ÔÚÈÎÎñÖ´ÐеIJ»Í¬½×¶Î£¬»Øµ÷ÏàÓ¦µÄ·½·¨¡£
Task²Î¿¼ÁËAsyncTask£¬¹¦ÄÜÀàËÆ£¬Ö»ÊÇ×öÁËһЩÍêÉÆ£»
jar°ü´óС45K£¬Ò²ËãÊDZȽÏÇáÁ¿µÄ¡£
Õâ¸öÄêÍ·£¬apk¶¯éü¼¸Ê®MÉõÖÁÉϰÙM£¬2.2MµÄ¿â²¢·Ç²»¿É½ÓÊÜ¡£
µ«ÊÇÒ²ÓÐһЩ³¡¾°£¬±È·½Ëµ¸øµÚÈý·½Ð´SDKµÄʱºò£¬¶Ô°ü´óСºÍÒÀÀµ±È½ÏÃô¸Ð£¬¶øÇÒÒ²²»ÐèÒªÕâô´ó¶øÈ«µÄÌØÐÔ£¬ÕâʱһЩÇáÁ¿¼¶µÄ·½°¸¾Í±È½ÏºÏÊÊÁË¡£
¶øÇÒ£¬³ýÁ˰ü´óС֮Í⣬TaskËùʵÏֵŦÄܺÍRxJavaÒ²²»¾¡Ïàͬ¡£
Èç¹û˵AsyncTaskÊÇ×ÔÐгµ£¬RxJavaÊÇÆû³µ£¬ÔòTaskÊÇĦÍгµ¡£
¸÷Óи÷µÄÓÃ;£¬¸÷Óи÷µÄÁé»ê¡£
Îå¡¢ÏÂÔØ
ÏîÄ¿ÒѾÉÏ´«µ½mavenºÍgithub, »¶Ó´ó¼ÒÏÂÔØ &
star
dependencies
{
implementation 'com.horizon.task:task:1.0.4'
} |
ÏîÄ¿µØÖ·£º
https://github.com/No89757/Task |