Android Developer's Worker Manager構造を使用してバックグラウンドでコードを実行するチュートリアルに従いましたが、ワーカーをキューに入れようとすると実行されず、次のエラーが表示されます:
2018-10-04 22:25:47.004 28669-28885/app.package.com.debug E/DefaultWorkerFactory: Could not instantiate app.package.com.MyWorker
Java.lang.NoSuchMethodException: <init> []
at Java.lang.Class.getConstructor0(Class.Java:2320)
at Java.lang.Class.getDeclaredConstructor(Class.Java:2166)
at androidx.work.DefaultWorkerFactory.createWorker(DefaultWorkerFactory.Java:58)
at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.Java:180)
at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.Java:117)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1162)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:636)
at Java.lang.Thread.run(Thread.Java:764)
2018-10-04 22:25:47.005 28669-28885/app.package.com.debug E/WorkerWrapper: Could for create Worker app.package.com.MyWorker
この問題はワーカーのデフォルトコンストラクターに関連している可能性がありますが、廃止されたデフォルト関数の代わりに正しいものを既に使用しています。
私の労働者は次のように宣言されています:
public class MyWorker extends Worker {
public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
// Doesn't even get called
}
}
そして、次のようにキューに入れられます:
WorkManager workManager = WorkManager.getInstance();
if (myWorkerRequest == null) {
myWorkerRequest = new OneTimeWorkRequest.Builder(MyWorker.class)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build())
.build();
}
WorkStatus workStatus = workManager.getStatusById(myWorkerRequest.getId()).getValue();
if (workStatus == null || !workStatus.getState().isFinished()) {
workManager.enqueue(myWorkerRequest);
}
例と異なるものは見当たらないので、このクラッシュの原因となるコードに他に何が影響するかを理解したいと思います。 ProGuardに関連するものでしょうか?
私のバージョンは1.0.0-alpha09
ありがとう!
これは 既知の問題 WorkManager 1.0.0-alpha09で、alpha10の修正済みとして既にマークされています。
回避策として、次の行をproguard構成に追加できます。
-keepclassmembers class * extends androidx.work.Worker {
public <init>(Android.content.Context,androidx.work.WorkerParameters);
}
同じ問題がありました。この問題の原因は、Workerクラスがネストされたクラスであったことです。独立したクラスにした瞬間、うまくいきました。
安定バージョン1.0.0でこの問題が発生したため、ワーカークラスをパブリックにすることで修正しました。
class MyWorker extends Worker {...} > public class MyWorker extends Worker {...}
私にとっての問題は、kotlinクラスのコンストラクターでした。
違う
class MyWorker(val app: Application, workerParams: WorkerParameters): Worker(app, workerParams)
良い
class MyWorker(val context: Context, workerParams: WorkerParameters): Worker(context, workerParams)