看到一个不错的总结,记录一下:
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的异步任务处理结果可以通过广播、本地广播等方式传回调用发。
参考文档:
http://www.onsandroid.com/2011/12/difference-between-android.html
http://geek.csdn.net/news/detail/71031 Android性能优化典范(五)