web-dev-qa-db-ja.com

Android Work Manager: "ワーカーをインスタンス化できませんでした"

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

ありがとう!

12
icarovirtual

これは 既知の問題 WorkManager 1.0.0-alpha09で、alpha10の修正済みとして既にマークされています。

回避策として、次の行をproguard構成に追加できます。

-keepclassmembers class * extends androidx.work.Worker {
    public <init>(Android.content.Context,androidx.work.WorkerParameters);
}
16
ianhanniballake

同じ問題がありました。この問題の原因は、Workerクラスがネストされたクラスであったことです。独立したクラスにした瞬間、うまくいきました。

6
Tony

安定バージョン1.0.0でこの問題が発生したため、ワーカークラスをパブリックにすることで修正しました。

class MyWorker extends Worker {...} > public class MyWorker extends Worker {...}
4
Michalsx

私にとっての問題は、kotlinクラスのコンストラクターでした。

違う

class MyWorker(val app: Application, workerParams: WorkerParameters): Worker(app, workerParams)

良い

class MyWorker(val context: Context, workerParams: WorkerParameters): Worker(context, workerParams)
2
Brian