Страница 1 из 1

Урок 29. WorkManager. Введение

Добавлено: 13 июн 2018, 22:09
damager82
В этом уроке знакомимся с WorkManager.


Click here to read this article!

Re: Урок 29. WorkManager. Введение

Добавлено: 14 июн 2018, 13:03
AntonShinkaretsky
Замечательный материал по фактам. Хотелось бы увидеть субъективное мнение специалиста - для решения каких задач лучше подходит WorkManager, а когда лучше использовать что-то ещё.

Re: Урок 29. WorkManager. Введение

Добавлено: 08 авг 2018, 01:13
Pringle
Ошибка в статье. Worker.Result. А у вас без точки

Re: Урок 29. WorkManager. Введение

Добавлено: 29 окт 2018, 10:22
wasiliysoft
Пожалуйста обновите статью, после обновления до worker manager alfa 10 код перестал работать, всю голову сломал как починить не знаю

Re: Урок 29. WorkManager. Введение

Добавлено: 22 янв 2019, 11:29
Dmitry100
wasiliysoft писал(а):Пожалуйста обновите статью, после обновления до worker manager alfa 10 код перестал работать, всю голову сломал как починить не знаю
implementation "android.arch.work:work-runtime:1.0.0-beta02"
отправка файла

Код: Выделить всё

...
Data.Builder builder = new Data.Builder().putString(SendFileWorker.KEY_FILE_PATH, imageFile.getAbsolutePath());
                        OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(SendFileWorker.class).setInputData(builder.build()).build();
                        switchToSendState();
                        WorkManager.getInstance().enqueue(request);
...

Re: Урок 29. WorkManager. Введение

Добавлено: 09 мар 2019, 11:30
jazzz17
Очень странно: похоже, OneTimeWorkRequest запускается у меня дважды.

логи:

Код: Выделить всё

2019-03-09 13:48:36.329 30594-30594/com.vsevolodvishnevsky.workmanager D/workmng: onCreate main
2019-03-09 13:48:36.700 30594-30594/com.vsevolodvishnevsky.workmanager D/workmng: onChanged main ENQUEUED
2019-03-09 13:48:36.787 30594-30628/com.vsevolodvishnevsky.workmanager D/workmng: doWork: start pool-1-thread-1
2019-03-09 13:48:36.803 30594-30594/com.vsevolodvishnevsky.workmanager D/workmng: onChanged main RUNNING
2019-03-09 13:48:46.790 30594-30628/com.vsevolodvishnevsky.workmanager D/workmng: doWork: end pool-1-thread-1
2019-03-09 13:48:46.816 30594-30594/com.vsevolodvishnevsky.workmanager D/workmng: onChanged main SUCCEEDED
2019-03-09 13:49:06.807 30594-30631/com.vsevolodvishnevsky.workmanager D/workmng: doWork: start pool-1-thread-2
2019-03-09 13:49:16.809 30594-30631/com.vsevolodvishnevsky.workmanager D/workmng: doWork: end pool-1-thread-2
код активити и myWorker:

Код: Выделить всё

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(MyWorker.TAG, "onCreate " + Thread.currentThread().getName());
        doWork();
    }

    public void doWork() {
        OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class).build();
        WorkManager.getInstance().enqueue(request);
        LiveData<WorkInfo> info = WorkManager.getInstance().getWorkInfoByIdLiveData(request.getId());
        info.observe(this, new Observer<WorkInfo>() {
            @Override
            public void onChanged(@Nullable WorkInfo workInfo) {
                Log.d(MyWorker.TAG, "onChanged " + Thread.currentThread().getName() + " " + workInfo.getState());
            }
        });
    }
}

Код: Выделить всё

public class MyWorker extends Worker {
   public static final String TAG = "working";

    public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        Log.d(TAG, "doWork: start "+ Thread.currentThread().getName());

        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Log.d(TAG, "doWork: end " + Thread.currentThread().getName());
        return Result.success();
    }
}
причем, при втором запуске статусы уже не приходят...

Re: Урок 29. WorkManager. Введение

Добавлено: 13 мар 2020, 10:53
pol
Добрый день!
Делаю периодическую задачу - определение уровня зарядки батареи, координат телефона и отправки на сервер. Батарея и отправка работают без проблем, а для получения координат я использую внешний класс со статической переменной типа Location. Так вот, обновить ее из WM не получается - задача просто зависает. И в результате мы имеем при запуске WM задачи кадждый раз предыдущее значение location.

Вообще возможно в задаче WM определять координаты?
и как из задачи остановить и запустить сервис?

Получилось запустить сервис геолокации:

Код: Выделить всё

contextOfApplication.startService(new Intent(getApplicationContext(), Tracker.class)); 
Однако с работой Wm в фоне на некоторых устройствах (типа Самсунг, андроид 7.0) наблюдается такое поведение: если тел не подключен к зарядке и экран погашен - задачи откладываются (сервис не стартует) пока или не включить экран или не подключить зарядку. Причем, в этот момент задачи срабатывают одновременно все, то есть сервис безо всякой необходимости перезапускается многократно.

Re: Урок 29. WorkManager. Введение

Добавлено: 19 июн 2021, 22:47
Bezliky
Спасибо тебе большое, очень хорошие уроки. Каптча при регистрации на форуме особенно улыбнула.

Реализовал WorkManager, но с устройствами возникают проблемы, из-за кастомизации прошивок производителями и ввода всяких энергосберегающих функций на некоторых устройствах данная библиотека не работает. Это мое первое приложение на Андроид :).

Re: Урок 29. WorkManager. Введение

Добавлено: 19 июн 2021, 22:49
Bezliky
pol писал(а):
13 мар 2020, 10:53
Добрый день!
Делаю периодическую задачу - определение уровня зарядки батареи, координат телефона и отправки на сервер. Батарея и отправка работают без проблем, а для получения координат я использую внешний класс со статической переменной типа Location. Так вот, обновить ее из WM не получается - задача просто зависает. И в результате мы имеем при запуске WM задачи кадждый раз предыдущее значение location.

Вообще возможно в задаче WM определять координаты?
и как из задачи остановить и запустить сервис?

Получилось запустить сервис геолокации:

Код: Выделить всё

contextOfApplication.startService(new Intent(getApplicationContext(), Tracker.class)); 
Однако с работой Wm в фоне на некоторых устройствах (типа Самсунг, андроид 7.0) наблюдается такое поведение: если тел не подключен к зарядке и экран погашен - задачи откладываются (сервис не стартует) пока или не включить экран или не подключить зарядку. Причем, в этот момент задачи срабатывают одновременно все, то есть сервис безо всякой необходимости перезапускается многократно.
Похожая проблема. Надо попробовать в настройках телефона дать максимальные разрешения приложению и отключить для него (приложения) всякие энергосберегающие фичи от прошивки производителя. Вот сайт где можно посмотреть как: https://dontkillmyapp.com/
Честно говоря бесит это, сам пришел с xcode, там подобной проблемы нет. :)

Re: Урок 29. WorkManager. Введение

Добавлено: 19 сен 2022, 17:02
An12
Чтобы получить Context в Worker классе, используйте метод getApplicationContext.
Зачем, ведь и так контекст передаётся в конструктор в виде параметра?

Код: Выделить всё

     /**
     * @param appContext   The application {@link Context}
     * @param workerParams Parameters to setup the internal state of this worker
     */
    public MyWorker(@NonNull Context appContext, @NonNull WorkerParameters workerParams) {
        super(appContext, workerParams);
    }