??????Android?У?????????????????????????????Thread??AsyncTask??HandlerThread????????????????????????ù???????????????????????????????????????????Android???????????????????????????????????????Щ???????????????????????????????Щ???????????????????????Щ????

????????????????????
???????Android??UI????????????е?UI???????????????????(UI???)???
????Android?и??????????????????????λ????????У????????????????
???????????ù?????????????????????????????????????????????????ANR(Application Not Responding)????????δ?????
???????????Android????ù?????????????????У?????????????????Android?й?????????к?????????????Χ??AsyncTask??HandlerThread???????о???
????AsyncTask
????AsyncTask??Android???????????????????????????????????????????????????????????????????????????Android?????У?AsyncTask??????á????AsyncTask?????????????????????????????????Щ????????????????о?AsyncTask?????????????????????
????AsyncTask?????й?
???????й???Android?????г????????????????????в????п?????3?????????й???????????????????OOM(OutOfMemory??????????????)??AsyncTask?????????п?????????й???
?????????????????????
??????Activity?У???????????????AsyncTask
????//In Activity
????new AsyncTask<String?? Void?? Void>() {
????@Override
????protected Void doInBackground(String... params) {
????//some code
????return null;
????}
????}.execute("hello world");
???????????????????????????AsyncTask??????????Java?У???????????????????????????????????????AsyncTask??????Activity?У?????????????Activity????????á?
????????AsyncTask???????У?mFuture???????????????????????mFuture?????????????????????????С?
????private final WorkerRunnable<Params?? Result> mWorker;
????public AsyncTask() {
????mFuture = new FutureTask<Result>(mWorker) {
????@Override
????protected void done() {
????//some code
????}
????};
????}
??????mFuture????????????????????????????????????????SERIAL_Executor???????SerialExecutor?????ArrayDeque?????????С?
????public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
????private static class SerialExecutor implements Executor {
????final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
????public synchronized void execute(final Runnable r) {
????mTasks.offer(new Runnable() {
????public void run() {
????//fake code
????r.run();
????}
????});
????}
????}
?????????????????????Activity???????????????SERIAL_EXECUTOR ?????С?
?????????????£????豸????????????????????Activity????????μ?Activity???????????????????????????
???????????У????????????????????AsyncTask???????Activity????????ù???????????Activity??????????????????治???GC?????????????????й?????
??????????α??????й????????????t??????? + ???????????????
????cancel??????
????AsyncTask???????????????????????????????????????AsyncTask.canncel()?????????????????????cancel???????????????á?
?????????????????cancel??????
????public final boolean cancel(boolean mayInterruptIfRunning) {
????mCancelled.set(true);
????return mFuture.cancel(mayInterruptIfRunning);
????}
????cancel???????????boolean????????????????mayInterruptIfRunning?????????????????????е?????
?????????????cancel(false)?????????????е??????????????
????????doInBackground?е?????????????????
?????????????????????onPostExecute?????????????onCancelled????
?????????????cancel(true)??????????????е???????????????????
???????doInBackground?????????????????????Thread.sleep??wait?????????????InterruptedException??
?????????Щ????£??п???????????????е?????
???????£??????cancel????????????????е??????????
????AsyncTask<String??Void??Void> task = new AsyncTask<String?? Void?? Void>() {
????@Override
????protected Void doInBackground(String... params) {
????boolean loop = true;
????while(loop) {
????Log.i(LOGTAG?? "doInBackground after interrupting the loop");
????}
????return null;
????}
????}
????task.execute("hello world");
????try {
????Thread.sleep(2000);//???AsyncTask???????
????task.cancel(true);
????} catch (InterruptedException e) {
????e.printStackTrace();
????}
?????????????????????cancel?????????????????У??????????????????????isCancelled()??????
???????д?????????
????Android??????AsyncTask??в???????????????????????£?
???????????Donut(1.6)?????????????
??????Donut??GINGERBREAD_MR1(2.3.4)??????????????????
??????HONEYCOMB??3.0?????????????????У???????????executeOnExecutor()????????С?
???????AsyncTask??????????????????????????
????????????????????????????
??????????????????е?????????????????
??????AsyncTask?У??????????????ThreadPoolExecutor?????????CORE_POOL_SIZE?????豸CPU????+1??MAXIMUM_POOL_SIZE??CPU??????2?? + 1??
?????????????????????????????????AsyncTask?????????
??????AsyncTask???????С??CORE_POOL_SIZE(5??)?????????μ??????????????????????е????
??????????????CORE_POOL_SIZE(5??)????????????????????????
????????????AsyncTask?????????????????????2???????????????????????????????????????ThreadPool????????????????????AsyncTask?в???????allowCoreThreadTimeOut(boolean)??????????ThreadPool?е?????????????????????????????
????Executors
????Executors??Java API?????????????????????????????????????????????
??????Executors?л??????????С????????????
????public static ExecutorService newFixedThreadPool(int nThreads) {
????return new ThreadPoolExecutor(nThreads?? nThreads??0L??
????TimeUnit.MILLISECONDS??new LinkedBlockingQueue<Runnable>());
????}
?????????????????У?CORE_POOL_SIZE??MAXIMUM_POOL_SIZE?????????????????nThreads?????????????????????????????????????????????????????????????????Executors??????API????????????????????????????????????
?????????????????????????????????д???ThreadPoolExecutor???????????豸??????CORE_POOL_SIZE??MAXIMUM_POOL_SIZE????????
????HandlerThread
????HandlerThread??Android???????????????????????????????????????????Looper????????????Looper?????????Handler???????????????????Handler??post?????????????????????????????????????
????private Handler mHandler;
????private LightTaskManager() {
????HandlerThread workerThread = new HandlerThread("LightTaskThread");
????workerThread.start();
????mHandler = new Handler(workerThread.getLooper());
????}
????public void post(Runnable run) {
????mHandler.post(run);
????}
????public void postAtFrontOfQueue(Runnable runnable) {
????mHandler.postAtFrontOfQueue(runnable);
????}
????public void postDelayed(Runnable runnable?? long delay) {
????mHandler.postDelayed(runnable?? delay);
????}
????public void postAtTime(Runnable runnable?? long time) {
????mHandler.postAtTime(runnable?? time);
????}