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

看到一个不错的总结,记录一下:

AsyncTask、Service、IntentService、Thread的使用和区别_第1张图片
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的异步任务处理结果可以通过广播、本地广播等方式传回调用发。

参考文档:
http://www.onsandroid.com/2011/12/difference-between-android.html
http://geek.csdn.net/news/detail/71031 Android性能优化典范(五)

你可能感兴趣的:(AsyncTask、Service、IntentService、Thread的使用和区别)