JobIntentService报RemoteException异常

JobIntentService经常报RemoteException异常

使用JobIntentService是为了替换IntentService,因为之前IntentService经常报RemoteServiceException

堆栈如下:

#155 AsyncTask #2
android.os.RemoteException

Remote stack trace:
at com.android.server.job.JobServiceContext.assertCallerLocked(JobServiceContext.java:487)
at com.android.server.job.JobServiceContext.doDequeueWork(JobServiceContext.java:365)
at com.android.server.job.JobServiceContext$JobCallback.dequeueWork(JobServiceContext.java:160)
at android.app.job.IJobCallback$Stub.onTransact(IJobCallback.java:83)
at android.os.Binder.execTransact(Binder.java:732)

img

img

看源码assertCallerLocked方法并不会抛出该异常呀,有没有朋友遇到过这种情况

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
这种情况可能是由于您在 JobIntentService 中执行的任务耗时过长,导致系统认为您的应用程序无响应,从而抛出 RemoteException 异常。在 JobServiceContext 类的 assertCallerLocked 方法中,会检查调用者是否属于系统进程或者应用程序本身。如果不是,则会抛出 RemoteException 异常。

解决这个问题的方法是,将耗时的操作移动到后台线程中执行,以避免阻塞主线程。您可以使用 AsyncTask 或者 Thread 等方式来创建后台线程。在 JobIntentServiceonHandleWork 方法中,可以启动这些后台线程,执行耗时的操作。例如:

public class MyJobIntentService extends JobIntentService {
    private static final int JOB_ID = 1000;

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, MyJobIntentService.class, JOB_ID, work);
    }

    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        // 启动后台线程执行耗时操作
        new MyTask().execute();
    }

    private class MyTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... voids) {
            // 执行耗时操作
            // ...
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            // 在主线程中更新 UI
            // ...
        }
    }
}

在上面的代码中,我们使用 AsyncTask 来创建后台线程执行耗时操作。在 onHandleWork 方法中,我们启动了一个 MyTask 实例来执行耗时操作。在 MyTaskdoInBackground 方法中,我们执行了实际的耗时操作。在 onPostExecute 方法中,我们可以在主线程中更新 UI。

这样做可以避免在 JobIntentService 中执行长时间的操作,从而减少出现 RemoteException 异常的可能性。同时,还可以使用 AsyncTask 在主线程和后台线程之间进行数据传递和 UI 更新。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢