Wie erstelle ich einen Worker mit Parametern für in WorkManager für Android?

Lesezeit: 2 Minuten

Die Android-Architektur hat neue Komponenten Arbeitsmanager.

Von dem Beispiel,

class CompressWorker(context : Context, params : WorkerParameters)
    : Worker(context, params) {

    override fun doWork(): Result {

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress()

        // Indicate success or failure with your return value:
        return Result.SUCCESS

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to try again.)

    }

}

val compressionWork = OneTimeWorkRequestBuilder<CompressWorker>().build()

Wie kann ich eine erstellen Worker die Parameter im Konstruktor oder akzeptieren doWork?

Benutzeravatar von Dhaval Patel
Dhaval Patel

Sie können verwenden setInputData Methode zum Senden von Daten, genau wie Bundle.

/***  Logic to set Data while creating worker **/
val compressionWork = OneTimeWorkRequest.Builder(CompressWorker::class.java)
val data = Data.Builder()
//Add parameter in Data class. just like bundle. You can also add Boolean and Number in parameter.
data.putString("file_path", "put_file_path_here")
//Set Input Data
compressionWork.setInputData(data.build())
//enque worker
WorkManager.getInstance().enqueue(compressionWork.build())


/*** Logic to get Data  ***/
class CompressWorker(context : Context, params : WorkerParameters)
    : Worker(context, params) {

    override fun doWork(): Result {

        //get Input Data back using "inputData" variable 
        val filePath =  inputData.getString("file_path")

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress()

        // Indicate success or failure with your return value:
        return Result.SUCCESS

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to try again.)

    }

}

Weitere Informationen finden Sie hier Verknüpfung.

  • Wie kann ich auf die Daten in Worker zugreifen?

    – Josua

    4. Oktober 2018 um 4:37 Uhr

  • params.getInputData().getString(“Dateipfad”)

    – Titto José

    21. Dezember 2018 um 6:08 Uhr

  • Gibt es eine Möglichkeit, nicht primitive Werte als Parameter zu senden?

    – Óscar

    8. Mai 2019 um 15:48 Uhr

  • Um den @Óscar-Punkt zu beantworten, finden Sie hier eine Diskussion darüber, wie ein serialisierbares POJO an einen Worker übergeben wird. stackoverflow.com/questions/51018299/…

    – Marino

    26. Oktober 2020 um 11:51 Uhr

  • @Óscar Seien Sie vorsichtig, wenn Sie versuchen, es zu verwenden workDataOf. Trotz seiner Methodensignatur können Sie seit dem Ergebnis nichts anderes als Primitive übergeben Data Objekt kann nur Primitive oder Arrays von Primitives enthalten. Sie erhalten eine IllegalArgumentException wenn Sie versuchen, etwas anderes zu passieren.

    – nkotula

    25. Mai 2021 um 16:57 Uhr


In Java:

Übergeben Sie die Parameter wie folgt:

    Constraints.Builder builder = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED);

    // Passing params
    Data.Builder data = new Data.Builder();
    data.putString("SyncMaster", syncModuleName);

    OneTimeWorkRequest syncWorkRequest =
            new OneTimeWorkRequest.Builder(SyncWorker.class)
                    .addTag("Sync")
                    .setInputData(data.build())
                    .setConstraints(builder.build())
                    .build();

    WorkManager.getInstance().enqueue(syncWorkRequest);

Sie können wie folgt erhalten:

public class SyncWorker extends Worker {

    private static final String TAG = "MyWorker";

    public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
        mContext = context;
    }

    @NonNull
    @Override
    public Result doWork() {
        Log.d(TAG, "doWork for Sync");
        String syncTable = getInputData().getString("SyncMaster");
        return Result.success();
    }
}

Hoffe, es wird eindeutig helfen.

1394040cookie-checkWie erstelle ich einen Worker mit Parametern für in WorkManager für Android?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy