[Android Studio] WorkManager problem z observe

0

Mam problem z odczytaniem danych z WorkManager'a.
Odpaliłem go wysyła do mnie dane zgodnie z API lecz ja nie mogę ich odczytać bo nie mogę odpalić funkcji:

lifecycleOwner - wyświetla się na czerwono w Android Studio i nie mogę skompilować opcję jakie mam to dodanie własnej zmiennej lecz nie znam
tej metody pewnie muszę dodać jakąś bibliotekę.

        WorkManager.getInstance(this).getWorkInfoByIdLiveData(saveRequest.getId()).observe(lifecycleOwner, info -> {
                    if (info != null && info.getState().isFinished()) {
                        int myResult = info.getOutputData().getInt(KEY_RESULT, myDefaultValue));
                        // ... do something with the result ...
                    }
                });
1

A w czym wołasz ten kawałek kodu. lifecycleOwner będzie dostępny w Activity lub Fragment

0

MainActivity.java

package com.myworker;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.LiveData;
import androidx.work.Constraints;
import androidx.work.Data;
import androidx.work.NetworkType;
import androidx.work.OneTimeWorkRequest;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkInfo;
import androidx.work.WorkManager;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.TimeUnit;



public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Data data = new Data.Builder()
                .putString(MyWorker.TASK_DESC, "The task data passed from MainActivity")
                .build();
        Constraints constraints=new Constraints.Builder()
                .setRequiredNetworkType( NetworkType.CONNECTED)
                .build();
        final WorkManager mWorkManager = WorkManager.getInstance(this);
        final PeriodicWorkRequest saveRequest =  new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES)
                .setConstraints(constraints)
                .setInputData(data)
                .build();

        findViewById(R.id.buttonEnqueue).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mWorkManager.enqueue(saveRequest);
            }
        });

        final TextView textView = findViewById(R.id.textViewStatus);        

        WorkManager.getInstance(this).getWorkInfoByIdLiveData(saveRequest.getId()).observe(lifecycleOwner, info -> {
            if (info != null && info.getState().isFinished()) {
                int myResult = info.getOutputData().getInt(KEY_RESULT, myDefaultValue));
                // ... do something with the result ...
            }
        });
    }
}

MyWorker.java

package com.myworker;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;

import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
import androidx.work.Data;
import androidx.work.Worker;
import androidx.work.WorkerParameters;

public class MyWorker extends Worker {

    //a public static string that will be used as the key
    //for sending and receiving data
    public static final String TASK_DESC = "task_desc";
 
    public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }


    @NonNull
    @Override
    public Result doWork() {
        String taskDesc = getInputData().getString(TASK_DESC);
        displayNotification("My Worker", taskDesc);
        //setting output data
        Data data = new Data.Builder()
                .putString(TASK_DESC, "The conclusion of the task")
                .build();
        return Result.success(data);
    }


    private void displayNotification(String title, String task) {
        NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel("simplifiedcoding", "simplifiedcoding", NotificationManager.IMPORTANCE_DEFAULT);
            notificationManager.createNotificationChannel(channel);
        }
        NotificationCompat.Builder notification = new NotificationCompat.Builder(getApplicationContext(), "simplifiedcoding")
                .setContentTitle(title)
                .setContentText(task)
                .setSmallIcon(R.mipmap.ic_launcher);

        notificationManager.notify(0, notification.build());
    }
}

Typowe przykłady ze strony developer.android.com lecz niestety nie działa lifecycleOwner.
Tak mam napisany kod na chwilę obecną by odpalić.

Można wkleić w nowy projekt i automatycznie zobaczyć jak się nie chcę skompilować.

1

AppCompatActivity to już jest LifecycleOwner. Przkeaż this.

0

Po dodaniu this zawiesza się aplikacja w symulatorze nie odpala się lecz kompiluje

0

OK, poszło miałem manifest źle skonfigurowany - bo próbowałem coś zdziałać.

Teram mam taki problem że doWork nie przekazuje Result.success(output).

W monitorowanym zdarzeniu otrzymuję następujące stany: ENQUEUED, RUNNING
I przez to nie dostaję danych "data" z doWork'a

 textView.append(workInfo.getState().name() + "\n"+ workInfo.getState()+ " "+myResult);
1
TomekMus napisał(a):

OK, poszło miałem manifest źle skonfigurowany - bo próbowałem coś zdziałać.

Teram mam taki problem że doWork nie przekazuje Result.success(output).

W monitorowanym zdarzeniu otrzymuję następujące stany: ENQUEUED, RUNNING
I przez to nie dostaję danych "data" z doWork'a

 textView.append(workInfo.getState().name() + "\n"+ workInfo.getState()+ " "+myResult);

Problem leży w tym, że używasz PeriodicWorkRequest, zastąp go OneTimeWorkRequest. W dokumentacji https://developer.android.com/reference/androidx/work/WorkInfo.State#SUCCEEDED masz wyjaśnione
"Note that PeriodicWorkRequests will never enter this state (they will simply go back to ENQUEUED and be eligible to run again). "

0

Ok. Dzięki za podpowiedź.
Czyli nie moge odczytać danych wewnątrz doWork bo są kasowane po wukonaniu i nie złapie ich metodą Sucess

Jak zarrzymać takiego Worka. Bo on pewnie za kazdy. Razem zmienia id

1 użytkowników online, w tym zalogowanych: 0, gości: 1