web-dev-qa-db-ja.com

AndroidのワークマネージャーでPOJOクラスを渡す方法は?

どのようにしてSerializableオブジェクトをwork managerでワークマネージャのsetDataメソッドで渡すことができますか?オブジェクトを渡してワークマネージャで処理する方法はありますか?

WorkManagerは、制約が満たされた後に実行されることが保証されている作業をエンキューするために使用されるライブラリです。WorkManagerは、作業ステータスの監視と複雑な作業チェーンを作成する機能を可能にします。

 Map<String, Object> map = new HashMap<>();
 AddressBookData addressBookData = new AddressBookData();
 addressBookData.setThreadId(001);

 map.put("AddressBookData", addressBookData);


 Data data = new Data.Builder()
                    .putAll(map)
                    .build();

 OneTimeWorkRequest compressionWork =
                new OneTimeWorkRequest.Builder(DataSyncWorker.class)
                        .setInputData(data)
                        .build();

アプリがクラッシュし、AddressBookDataが有効なクラスではないなどのエラーが表示されます。

注:ワークマネージャーでPOJOクラスを渡し、doWorkメソッドでワークマネージャーからInputDataを取得します。

12

WorkManagerにPOJOを直接提供することはできません。 Data.Builder#putAllメソッドの documentation を参照してください。

有効なタイプは、ブール、整数、ロング、ダブル、ストリング、およびこれらの各タイプの配列バージョンです。

可能であれば、POJOをシリアル化できます。たとえば、本当に小さくてシンプルな場合は、JSONを使用して文字列にエンコードし、ワーカーでデコードできます。

ただし、より複雑なクラスの場合は、個人的にそれらをデータベース(SQLite、Room)に格納し、指定されたオブジェクトの主キーを渡します。次に、ワーカーはデータベースからオブジェクトをフェッチします。ただし、私の経験では、通常は回避できます。

6
Martin Melka

今日、私もこの問題に直面しています。だから私はオブジェクトを渡す方法を見つけます。

私の要件はパスBitmapオブジェクトです。 (あなたはあなたの要件に従って渡すことができます)

Gradleファイルに依存関係を追加する

Gradle:

dependencies {
  implementation 'com.google.code.gson:gson:2.8.5'
}

オブジェクトをシリアライズおよびデシリアライズするには、以下のメソッドを使用します

 // Serialize a single object.
    public static String serializeToJson(Bitmap bmp) {
        Gson gson = new Gson();
        return gson.toJson(bmp);
    }

    // Deserialize to single object.
    public static Bitmap deserializeFromJson(String jsonString) {
        Gson gson = new Gson();
        return gson.fromJson(jsonString, Bitmap.class);
    }

オブジェクトをシリアル化します。

 String bitmapString = Helper.serializeToJson(bmp);

データオブジェクトに渡します。

 Data.Builder builder = new Data.Builder();
 builder.putString("bmp, bitmapString);
 Data data = builder.build();
        OneTimeWorkRequest simpleRequest = new OneTimeWorkRequest.Builder(ExampleWorker.class)
                .setInputData(data)
                .build();
        WorkManager.getInstance().enqueue(simpleRequest);

Workerクラスで値を処理します。

Data data = getInputData();
String bitmapString = data.getString(NOTIFICATION_BITMAP);
Bitmap bitmap = Helper.deserializeFromJson(bitmapString);

これで、ビットマップオブジェクトがWorkerクラスに用意されました。

乾杯!

2
Yogesh Rathi