首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

启动IntentService会抛出NullpointerException,并且永远不会调用onHandleIntent()

()的原因是因为IntentService的onCreate()方法中没有正确地初始化HandlerThread,导致后续的消息处理出现问题。

IntentService是Android提供的一种特殊的Service,用于处理异步任务。它内部通过HandlerThread和Handler实现了一个工作线程,可以按顺序处理传递给它的Intent请求。

当启动IntentService时,系统会调用其onCreate()方法进行初始化操作。在默认的IntentService实现中,onCreate()方法会创建一个HandlerThread,并在该线程上创建一个Handler。然而,由于IntentService的onCreate()方法没有正确地初始化HandlerThread,导致Handler无法正常工作,进而导致NullpointerException的抛出。

要解决这个问题,可以自定义一个继承自IntentService的子类,并在其中正确地初始化HandlerThread。以下是一个示例:

代码语言:java
复制
public class MyIntentService extends IntentService {
    private HandlerThread handlerThread;
    private Handler handler;

    public MyIntentService() {
        super("MyIntentService");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        handlerThread = new HandlerThread("MyIntentServiceThread");
        handlerThread.start();
        handler = new Handler(handlerThread.getLooper());
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // 在这里处理具体的任务逻辑
    }
}

在上述示例中,我们通过重写onCreate()方法,在其中正确地初始化了HandlerThread,并创建了一个与之关联的Handler。这样,在启动MyIntentService时,就不会抛出NullpointerException,并且可以正常调用onHandleIntent()方法来处理任务。

关于IntentService的更多信息,可以参考腾讯云的相关文档和产品介绍:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

正确使用IntentService的姿势

); 26 } 27 } 如果你通过bindService的方式启动,如果IntentService没有启动过,确实走onCreate方法,但是onCreate中没有去调用handler...我们都知道bindService启动的生命周期是不会回调onStart的生命周期的,所以onHandleIntent的异步处理方法也不会回调。...也就是说,如果您使用bindService方法启动IntentService,其实不会享受到IntentService的一点优点。...onHandleIntent根本不会调用,和启动一个普通的Service没两样。 综上,我们应该使用startService的方式启动IntentService。...并且通过源码我们知道,处理异步任务是在onHandleIntent中的。所以我们应该将任务逻辑放在onHandleIntent中处理。 . 3.应用 学以致用。

2.2K20

Android 多线程-IntentService详解

IntentService,然后去下载图片,注意即使我们多次启动IntentService,但IntentService的实例只有一个,这跟传统的Service是一样的,最终IntentService会去调用...这里可能我们还会担心for循环去启动任务,而实例又只有一个,那么任务会不会被覆盖掉呢?...其实是不会的,因为IntentService真正执行异步任务的是HandlerThread+Handler,每次启动都会把下载图片的任务添加到依附的消息队列中,最后由HandlerThread+Handler...其实IntentService启动后还会去调用onStartCommand方法,而onStartCommand方法又会去调用onStart方法,我们看看它们的源码: @Override public void...,而Looper是按顺序从消息队列中取任务的,也就是说IntentService的后台任务时顺序执行的,当有多个后台任务同时存在时,这些后台任务按外部调用的顺序排队执行,我们前面的使用案例也很好说明了这点

62030
  • 2016级移动应用开发在线测试12-service

    ()Service比Activity有个更高的优先级(在系统中永远运行的组件)。在系统资源紧张时,Service不会轻易被Android系统终止。...Service服务不会自动启动线程,如果没有人工调用多线程方式进行启动,Service将寄存于主线程当中。...()Service服务不会自动创建线程,如果开发人员没有为Service服务添加异步操作,那Service服务将运行于主线程运行时间过长也产生ANR,服务主线程ANR的超时时间是60秒。...()即使我们多次启动IntentService,但IntentService的实例只有一个,这跟传统的Service是一样的,最终IntentService会去调用onHandleIntent执行异步任务...()创建IntentService时,只需实现onHandleIntent和构造方法,onHandleIntent为异步方法,可以执行耗时操作。

    50120

    Android多线程:深入剖析IntentService源码

    源码分析 IntentService的源码工作流程如下: 特别注意:若启动IntentService 多次,那么 每个耗时操作 则 以队列的方式 在 IntentServiceonHandleIntent...工作任务队列 = 顺序执行 即 若一个任务正在IntentService中执行,此时你再发送1个新的任务请求,这个新的任务一直等待直到前面一个任务执行完毕后才开始执行 原因: 由于onCreate...()只会调用一次 = 只会创建1个工作线程; 当多次调用 startService(Intent)时(即 onStartCommand()也会调用多次),其实不会创建新的工作线程,只是把消息加入消息队列中...3, 所以,多次启动 IntentService 按顺序执行事件 若服务停止,则会清除消息队列中的消息,后续的事件不执行 注意事项2:不建议通过 bindService() 启动 IntentService...() 即,并不会调用onStart() 或 onStartcommand(),故不会将消息发送到消息队列,那么onHandleIntent()将不会回调,即无法实现多线程的操作 此时,你应该使用Service

    59130

    全面理解:Android中的线程及线程池

    那就看ServiceHandler,其继承自Handler,handleMessage方法中先调用了抽象方法onHandleIntent((Intent)msg.obj),参数就是启动service的intent...使用场景:如果同时有多个服务启动请求发送到onStartCommand(),不应该在处理完一个请求后调用stopSelf();因为在调用此函数销毁service之前,可能service又接收到新的启动请求...所以,当多次启动service,就会多次调用 onStart,那么会有多个任务发出,当每次任务执行完onHandleIntent时,stopSelf(int startId)中会判断,若又启动service...(不管已启动的核心线程是否空闲) 如果线程池中的线程数已到达或超过核心线程数,那么任务插入到任务队列中排队等待执行。...如果3中线程数达到最大线程数,那么拒绝执行任务,即会调用RejectedExecutionHandler的rejectedExecution()通知调用者。

    1.2K10

    intentservice使用(Intention)

    一样,同时,当任务执行完后,IntentService 自动停止,而不需要我们去手动控制。...另外,可以启动 IntentService 多次,而每一个耗时操作以工作队列的方式在IntentServiceonHandleIntent 回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个...或 Messenger 使得 IntentService 和 Activity 可以通信,这样那么 onHandleIntent() 不会被回调,相当于在你使用 Service 而不是 IntentService...为什么多次启动 IntentService 顺序执行事件,停止服务后,后续的事件得不到执行?...中使用的 Handler、Looper、MessageQueue 机制把消息发送到线程中去执行的,所以多次启动 IntentService 不会重新创建新的服务和新的线程,只是把消息加入消息队列中等待执行

    40820

    Android 进阶16:IntentService 使用及源码解析

    由于是一个 Service,IntentService 的优先级比较高,在后台不会轻易被系统杀死;它可以接收 Intent 请求,然后在子线程中按顺序执行。...() 方法返回前销毁时,重启进程,重新使用之前的 Intent 启动这个服务 //(如果有多个 Intent,只会使用最后的一个) //如果设置为 false,onStartCommand...startId 以消息的形式发送到 Handler 在 Handler 中将消息队列中的 Intent 按顺序传递给 onHandleIntent() 方法 在处理完所有启动请求后自动停止服务,不需要我们调用...IntentService 的使用 通过前面的源码分析,我们可以看到,最终每个任务的处理都会调用 onHandleIntent(),因此使用 IntentService 也很简单,只需实现 onHandleIntent...一句话总结 IntentService: 优先级比较高的、用于串行执行异步任务、自尽的 Service。

    1K90

    Android查缺补漏(线程篇)-- IntentService的源码浅析

    二、IntentService启动任务过程分析 外界首次调用startService方法来启动IntentService时,就会触发onCreate()方法,完成上面操作。...onHandleIntent方法来执行我们创建的异步任务,当执行完onHandleIntent中的代码就会使用stopSelf(msg.arg1)尝试关闭Service。...stopSelf(int startId):尝试停止服务,当还有其他消息未处理,等待其他消息处理完后再关闭) 三、IntentService优势 由于IntentService是一个服务,所以在执行后台任务时不容易被杀死...在Activity中开启了线程后,当退出了Activity时如果线程中的任务没有执行完毕,线程是不会退出的。...而此时再打开同一个Activity又会创建一个新的线程,就是说在Activity中创建的线程不会随着Activity的销毁而销毁,是不可控的。

    41540

    线程优化

    线程封装类,将Thread与handler结合使用 优势: 将loop运行在子线程中处理,减轻了主线程的压力,使主线程更流畅 串行执行,开启一个线程起到多个线程的作用 有自己的消息队列,不会干扰...,默认为我们开启了一个工作线程,使用这个工作线程逐一处理所有启动请求,在任务执行完毕后会自动停止服务,使用简单,只要实现一个方法 onHandleIntent,该方法会接收每个启动请求的 Intent,...可以启动 IntentService 多次,而每一个耗时操作以队列的方式在 IntentService 的 onHandlerIntent 回调方法中执行,并且,每一次只会执行一个工作线程,执行完第一个再执行第二个...并且等待所有消息都执行完后才终止服务。 IntentService 适用于 APP 在不影响当前用户的操作的前提下,在后台默默的做一些操作。...() 通过 onHandleIntent() 来依次处理所有 Intent 请求对象所对应的任务 如果start了多次,每一次都会在WorkerThread中依次执行,当全部执行完成,它就会自己调用

    1.1K10

    Android查缺补漏(线程篇)-- IntentService的源码浅析

    二、IntentService启动任务过程分析 外界首次调用startService方法来启动IntentService时,就会触发onCreate()方法,完成上面操作。...onHandleIntent方法来执行我们创建的异步任务,当执行完onHandleIntent中的代码就会使用stopSelf(msg.arg1)尝试关闭Service。...stopSelf(int startId):尝试停止服务,当还有其他消息未处理,等待其他消息处理完后再关闭) 三、IntentService优势 由于IntentService是一个服务,所以在执行后台任务时不容易被杀死...在Activity中开启了线程后,当退出了Activity时如果线程中的任务没有执行完毕,线程是不会退出的。...而此时再打开同一个Activity又会创建一个新的线程,就是说在Activity中创建的线程不会随着Activity的销毁而销毁,是不可控的。

    40920

    Android查缺补漏(线程篇)-- IntentService的源码浅析

    二、IntentService启动任务过程分析 外界首次调用startService方法来启动IntentService时,就会触发onCreate()方法,完成上面操作。...onHandleIntent方法来执行我们创建的异步任务,当执行完onHandleIntent中的代码就会使用stopSelf(msg.arg1)尝试关闭Service。...stopSelf(int startId):尝试停止服务,当还有其他消息未处理,等待其他消息处理完后再关闭) 三、IntentService优势 由于IntentService是一个服务,所以在执行后台任务时不容易被杀死...在Activity中开启了线程后,当退出了Activity时如果线程中的任务没有执行完毕,线程是不会退出的。...而此时再打开同一个Activity又会创建一个新的线程,就是说在Activity中创建的线程不会随着Activity的销毁而销毁,是不可控的。

    33220

    Android IntentService 分析和用法

    IntentService 简介 IntentService继承自Service,可用startService启动,也需要在AndroidManifest.xml中注册 IntentService在一个单独的...worker线程中处理任务 任务完成后,自动停止 可多次启动同一个IntentService,它们自一个接一个地排队处理 IntentService 与 Service 耗时任务可以不用在Service...在ServiceHandler中每次处理完一个命令都会调用stopSelf(int startId)方法来停止服务。 IntentService直到命令队列中的所有命令被执行完后才会停止服务。...StartId=" + mStartId); } @Override protected void onHandleIntent(@Nullable Intent intent...StartId=4 可以看出,先执行onStart,然后排队执行onHandleIntent。任务全部结束后自行停止。

    63830

    Android Service的解析

    如果设置为true,则能够被调用或交互(通常如果一个服务需要跨进程使用需要这么设置),设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。...: 是一种特殊的Service,继承自Service并且本身就是一个抽象类。...创建IntentService时,只需实现onHandleIntent和构造方法,onHandleIntent为异步方法,可以执行耗时操作。...IntentService的创建 编写自己的Service类继承IntentService,并重写其中的onHandleIntent(Intent)方法,该方法是IntentService的一个抽象方法...的测试活动,并在点击按钮时调用startService系统函数来开启IntentService的服务,示例代码如下: public class TgsActivity extends Activity

    12810
    领券