IntentServicce;Looper;long-running task
7. If you want to carry on a long-running task, what do you need to do?
IntentService;Service
Service:执行的操作,依然是在UI线程中执行;如果是耗时的操作,或者是阻塞的操作,那么,会阻塞UI线程,造成ANR现象的出现。
A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. Each service class must have a corresponding <service> declaration in its package's AndroidManifest.xml. Services can be started with Context.startService() and Context.bindService().
Note that services, like other application objects, run in the main thread of their hosting process. This means that, if your service is going to do any CPU intensive (such as MP3 playback) or blocking (such as networking) operations, it should spawn its own thread in which to do that work. More information on this can be found in Processes and Threads. The IntentService class is available as a standard implementation of Service that has its own thread where it schedules its work to be done.
IntentService: 会创建一个自己的独立线程,区别于UI线程。这样,任何耗时的操作,都可以通过IntentService来实现。
IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests through startService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.
This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.
All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.
IntentService的源码:
在使用的时候,只需要定义一个构造函数,提供一个Name;然后,重写onHandleIntent(Intent)方法,在该方法中,可以写上耗时操作,会导致阻塞的操作。
然后,就可以了。按照使用Service那样使用。但是,耗时操作时放到onHandleIntent(Intent)中。
因为,该方法是在独立线程中执行的,不会影响到UI线程。
-----从下面IntentService的实现可知。
-----如果,有多个耗时操作的执行请求,发送给该IntentService来执行,那么,如何处理呢?
因为,只是创建了一个IntentService,对应只是创建了一个Thread;每次发出执行请求,
系统都会回调该方法:
 @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }
也就是,每个执行请求(Intent),变成了每个Message。
每个Message的实际处理,由派生类中的onHandleIntent方法来执行。
所以,即使有多个耗时操作的执行请求,但是每次该IntentService每次只执行一个耗时操作。
IntentService的源码:
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;
/**
* An abstract {@link Service} that serializes the handling of the Intents passed upon service
* start and handles them on a handler thread.
*
* <p>To use this class extend it and implement {@link #onHandleIntent}. The {@link Service} will
* automatically be stopped when the last enqueued {@link Intent} is handled.
*/
public abstract class IntentService extends Service {
    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;
    private String mName;
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;
    }
@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) {
        super.onStart(intent, startId);
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }
@Override
    public void onDestroy() {
        mServiceLooper.quit();
    }
@Override
    public IBinder onBind(Intent intent) {
        return null;
    }
/**
     * Invoked on the Handler thread with the {@link Intent} that is passed to {@link #onStart}.
     * Note that this will be invoked from a different thread than the one that handles the
     * {@link #onStart} call.
     */
    protected abstract void onHandleIntent(Intent intent);
}
IntentServicce;Looper;long-running task的更多相关文章
- get running task , process and service
		public class MyActivityManager extends ExpandableListActivity { private static final String NAME = & ... 
- How to:Aborting a long running task in TPL
		http://social.msdn.microsoft.com/Forums/vstudio/en-US/d0bcb415-fb1e-42e4-90f8-c43a088537fb/aborting- ... 
- asp.net web api long running task
		http://stackoverflow.com/questions/17577016/long-running-task-in-webapi http://blog.stephencleary.co ... 
- C#并行编程-Task
		菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ... 
- 【转】【C#】【Thread】【Task】多线程
		多线程 多线程在4.0中被简化了很多,仅仅只需要用到System.Threading.Tasks.::.Task类,下面就来详细介绍下Task类的使用. 一.简单使用 开启一个线程,执行循环方法,返回 ... 
- TaskTracker任务初始化及启动task源码级分析
		在监听器初始化Job.JobTracker相应TaskTracker心跳.调度器分配task源码级分析中我们分析的Tasktracker发送心跳的机制,这一节我们分析TaskTracker接受JobT ... 
- 【Hadoop代码笔记】Hadoop作业提交之TaskTracker获取Task
		一.概要描述 在上上一篇博文和上一篇博文中分别描述了jobTracker和其服务(功能)模块初始化完成后,接收JobClient提交的作业,并进行初始化.本文着重描述,JobTracker如何选择作业 ... 
- Hadoop作业提交之TaskTracker获取Task
		[Hadoop代码笔记]Hadoop作业提交之TaskTracker获取Task 一.概要描述 在上上一篇博文和上一篇博文中分别描述了jobTracker和其服务(功能)模块初始化完成后,接收JobC ... 
- Task Cancellation: Parallel Programming
		http://beyondrelational.com/modules/2/blogs/79/posts/11524/task-cancellation-parallel-programming-ii ... 
随机推荐
- 11.24Daily Scrum(4)
			人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.1007 实现视频浏览的功能 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.1008 实现视频浏 ... 
- 20145214 《Java程序设计》第9周学习总结
			20145214 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是java联机数据库的标准规范.它定 ... 
- 实现虚拟机VMware上Centos的linux与windows互相复制与粘贴
			转自:http://blog.csdn.net/u012243115/article/details/40454063 1.打开虚拟机的菜单“虚拟机”,下拉框中会有一个“安装 VMwareTools” ... 
- LintCode-5.第k大元素
			第k大元素 在数组中找到第k大的元素 注意事项 你可以交换数组中的元素的位置 样例 给出数组 [9,3,2,4,8],第三大的元素是 4 给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的 ... 
- iOS开发CABasicAnimation动画理解
			1.CALayer简介 CALayer是个与UIView很类似的概念,同样有backgroundColor.frame等相似的属性,我们可以将UIView看做一种特殊的CALayer.但实际上UIVi ... 
- TCP系列13—重传—3、协议中RTO计算和RTO定时器维护
			从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新.由于网络状况可能会受到路由变化.网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新.如果T ... 
- js实现倒计时60秒的简单代码
			<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ... 
- C# Find()和First()与FirstOrDefault(
			1. Find方法只能在List<T>上使用,而后者能更广泛应用在IEnemerable<T>上. Find最终是建立在Array的查找之上,而在IEnemerable上的Fi ... 
- ifstat查看网络流量的原理
			ifstat查看网卡流量的原理:读的是哪个/proc/ 接口啊 同diskIO一样,网络的IO也同样有统计计数的,是/proc/net/dev一个典型的输出就是这个样子的: root@station6 ... 
- 第三章 AOP
			什么是AOP AOP的编写方式 什么是AOP? 是一种面向切面的思想,关注的是切面中的相似功能,将这些功能抽离出来,提高代码的复用性 AOP术语 advice-通知:要执行的任务 Spring切面有5 ... 
