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)
看源码assertCallerLocked方法并不会抛出该异常呀,有没有朋友遇到过这种情况
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
这种情况可能是由于您在 JobIntentService
中执行的任务耗时过长,导致系统认为您的应用程序无响应,从而抛出 RemoteException
异常。在 JobServiceContext
类的 assertCallerLocked
方法中,会检查调用者是否属于系统进程或者应用程序本身。如果不是,则会抛出 RemoteException
异常。
解决这个问题的方法是,将耗时的操作移动到后台线程中执行,以避免阻塞主线程。您可以使用 AsyncTask
或者 Thread
等方式来创建后台线程。在 JobIntentService
的 onHandleWork
方法中,可以启动这些后台线程,执行耗时的操作。例如:
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
实例来执行耗时操作。在 MyTask
的 doInBackground
方法中,我们执行了实际的耗时操作。在 onPostExecute
方法中,我们可以在主线程中更新 UI。
这样做可以避免在 JobIntentService
中执行长时间的操作,从而减少出现 RemoteException
异常的可能性。同时,还可以使用 AsyncTask
在主线程和后台线程之间进行数据传递和 UI 更新。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢