Thread(线程):
程序最小的执行单元,是分配给CPU的基本单位,用来执行异步操作
Thread(线程)的生命周期:
新建(new Thread)
就绪(线程已经启动,等待CPU资源)
运行(run已经获得资源)
死亡(执行完成 或 被杀死)
阻塞(因为某种原因线程让出CPU资源,就会进入阻塞状态)
新建——>就绪——>运行——>死亡——>阻塞
注意:
线程一旦运行起来,就和Activity失去了联系
即使Activity被销毁了,线程依旧能执行下去
总结:
线程是无法控制的
Service(服务):
Service是在主线程中运行的,但它不是一个线程,不能做耗时操作,会报ANR异常
问题:
Service不能做耗时操作,就意味着无法替代Thread的功能,那Service有啥意义啊?
解答:
这就是IntentService和Service的区别了
IntentService是一个处理异步请求的类,继承Service的service类
IntentService的内部有一个工作线程来处理耗时的操作
IntentService特有方法onHandleIntent,以队列方式执行工作线程
IntentService的源码如下:
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); //执行完耗时操作后,Service就被销毁掉了
}
}
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();
//创建一个Handler,这个时候Looper已经运行起来了,在HandlerThread的run方法中
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
@Override
public void onDestroy() {
mServiceLooper.quit();
}
@Override
@Nullable
public IBinder onBind(Intent intent) {
return null;
}
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);
}
Handler,Looper都是Android消息机制中特有的类
thread.start()代表着线程开启,随后通过 mServiceLooper = thread.getLooper()获取Looper
mServiceHandler = new ServiceHandler(mService)并将looper放到Handler的构造函数中
IntentService的本质是自动新建一个线程,并为之创建一个Looper(Android只有主线程自带Looper,其他线程不带Looper,必须自己创建)。并通过Looper向Handler传递消息,完成异步操作。
最后当Looper队列中的消息全部传达完之后,IntentService会自动销毁。
把异步操作扔给IntentService,这位老哥把活干完向主线程报告了以后还会自杀,简直是根本不要操心