Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¼ÓÇ¿°æÒì²½ÈÎÎñ¿ò¼Ü
 
  2767  次浏览      27
2019-5-16
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ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

 
   
2767 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì