AsyncTask、Service、IntentService、Thread的使用和区别

看到一个不错的总结,记录一下:
AsyncTask、Service、IntentService、Thread的使用和区别
文章图片
image.png AsyncTask常用来实现一次性的耗时任务,然后更新界面。常见的例子有:按下按钮时拉取/处理任务。Android 原生的 AsyncTask.java 是对线程池的一个封装,使用其自定义的 Executor 来调度线程的执行方式(并发还是串行),并使用 Handler 来完成子线程和主线程数据的共享。
AsyncTask内部使用线程池来完成任务,线程池、handler等都是static对象,所有的AsyncTask共用。android 3.0以后,AsyncTask内部使用SerialExecutor来保证所有任务的串行执行。谷歌官方建议AsyncTask在需要在耗时任务中与UI保持通信时使用,不能执行太耗时的任务。否则可能出现AsyncTask不能立即执行下发任务的情况。也可以使用executeOnExecutor来使用多线程执行后台任务。

AsyncTasks should ideally be used for short operations (a few seconds at the most.)
在一些场景下,AsyncTask和Service都可以完成同样的任务,但是可能某一个更合适。
Service通常都在后台运行,在上面的例子中,也可以在按下按钮时启动一个Service,让它来拉取/处理数据,然后结束运行。这种方法的问题是运行效率太低,使用AsyncTask更合适。当你需要在后台一直做一件事,如播放音乐,轮询检查新数据等,这种场景使用Service更合适。
Service运行在主线程,使用时不能处理耗时任务。可以在内部使用thread来完成耗时任务。Service还可以使用process属性将其运行在不同的线程中,提高进程的保活性。
IntentService是一个基于Service的一个类,用来处理异步的请求。你可以通过startService(Intent)来提交请求,该Service会在需要的时候创建,当完成所有的任务以后自己关闭,且请求是在工作线程处理的。它使用HandlerThread+Handler来实现异步调用。源代码可参考如下:
/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package android.app; import android.content.Intent; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.Looper; import android.os.Message; public abstract class IntentService extends Service { private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; private String mName; private boolean mRedelivery; private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); }@Override public void handleMessage(Message msg) { onHandleIntent((Intent)msg.obj); stopSelf(msg.arg1); } }public IntentService(String name) { super(); mName = name; }public void setIntentRedelivery(boolean enabled) { mRedelivery = enabled; }@Override public void onCreate() { super.onCreate(); HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); }@Override public void onStart(Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); }@Override public int onStartCommand(Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; }@Override public void onDestroy() { mServiceLooper.quit(); }@Override public IBinder onBind(Intent intent) { return null; }protected abstract void onHandleIntent(Intent intent); }

Service和IntentService的异步任务处理结果可以通过广播、本地广播等方式传回调用发。
【AsyncTask、Service、IntentService、Thread的使用和区别】参考文档:
http://www.onsandroid.com/2011/12/difference-between-android.html
http://geek.csdn.net/news/detail/71031 Android性能优化典范(五)

    推荐阅读