JobIntentService 上的 IllegalArgumentException 主要在三星设备上

Posted

技术标签:

【中文标题】JobIntentService 上的 IllegalArgumentException 主要在三星设备上【英文标题】:IllegalArgumentException on JobIntentService mainly on Samsung devices 【发布时间】:2019-12-14 04:53:35 【问题描述】:

我遇到了很多无法重现的 IllegalArgumentException 崩溃。其中 99% 来自三星 Galaxy 设备。 这是来自 Play 商店控制台的日志:

java.lang.RuntimeException: 
  at android.os.AsyncTask$3.done (AsyncTask.java:354)
  at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:383)
  at java.util.concurrent.FutureTask.setException (FutureTask.java:252)
  at java.util.concurrent.FutureTask.run (FutureTask.java:271)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
  at java.lang.Thread.run (Thread.java:764)
Caused by: java.lang.IllegalArgumentException: 
  at android.app.job.JobParameters.completeWork (JobParameters.java:268)
  at android.support.v4.app.JobIntentService$JobServiceEngineImpl$WrapperWorkItem.complete (JobIntentService.java:268)
  at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground (JobIntentService.java:394)
  at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground (JobIntentService.java:383)
  at android.os.AsyncTask$2.call (AsyncTask.java:333)
  at java.util.concurrent.FutureTask.run (FutureTask.java:266)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
  at java.lang.Thread.run (Thread.java:764)

我有 6 个 JobInentServices,每个都更新一个小部件。每个 JobIntentService 都有一个唯一的 5 位 JOB_ID,以避免与库中的 JOB_ID 发生任何可能的冲突。

在我上次更新之前,我使用了其他 JOB_ID,因为我怀疑某些 ID 导致了这个异常。现在有了新的 ID,这些崩溃就会大大增加。

变化是造成这种情况的原因吗?应用程序是否“记住”了旧的 ID,现在同一个 JobIntentService 有 2 个不同的 ID? 为什么这只发生在三星设备上? 意图可能是此异常的根源吗? 有没有办法解决这个问题?

我的小部件提供商的代码:

Intent intent = new Intent(context.getApplicationContext(),
                        WidgetEcoService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
                WidgetEcoService.enqueueWork(context.getApplicationContext(), intent);

我的 JobIntentService 代码:

public static final int JOB_ID = 45454;
public static void enqueueWork(Context context, Intent work) 
        enqueueWork(context, WidgetEcoService.class, JOB_ID, work);

提前谢谢你。

【问题讨论】:

【参考方案1】:

根据“The CommonsBlog”:

    The docs point out that the id needs to be stable across app updates,
and therefore an id resource is unsuitable

所以答案是我上次更新时更改 JOB_ID 是我自己的一个错误,我现在什么都做不了。

【讨论】:

您最终解决了问题吗?我也有同样的问题...... 很遗憾,如果您更改 JOB_ID,则无需执行任何操作。

以上是关于JobIntentService 上的 IllegalArgumentException 主要在三星设备上的主要内容,如果未能解决你的问题,请参考以下文章

来自 JobIntentService 的吐司

JobIntentService 的 onDestroy 被调用后会发生啥?

JobIntentService 不调用 OnHandleWork

JobIntentService - onHandleWork 并不总是被调用?

JobIntentService 不会在 Android 8.0 上立即启动

Proguard:JobIntentService IllegalArgumentException启用模糊处理