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

Ответить
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 13 июн 2018, 22:09

В этом уроке знакомимся с WorkManager.


Click here to read this article!
Последний раз редактировалось damager82 20 дек 2018, 11:55, всего редактировалось 7 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

AntonShinkaretsky
Сообщения: 1
Зарегистрирован: 14 июн 2018, 12:47

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

Сообщение AntonShinkaretsky » 14 июн 2018, 13:03

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

Pringle
Сообщения: 1
Зарегистрирован: 08 авг 2018, 00:44

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

Сообщение Pringle » 08 авг 2018, 01:13

Ошибка в статье. Worker.Result. А у вас без точки

wasiliysoft
Сообщения: 9
Зарегистрирован: 11 фев 2015, 18:58
Контактная информация:

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

Сообщение wasiliysoft » 29 окт 2018, 10:22

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

Dmitry100
Сообщения: 3
Зарегистрирован: 30 дек 2012, 06:30

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

Сообщение Dmitry100 » 22 янв 2019, 11:29

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);
...

jazzz17
Сообщения: 2
Зарегистрирован: 08 мар 2019, 11:09

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

Сообщение jazzz17 » 09 мар 2019, 11:30

Очень странно: похоже, 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();
    }
}
причем, при втором запуске статусы уже не приходят...

pol
Сообщения: 1
Зарегистрирован: 13 мар 2020, 10:47

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

Сообщение pol » 13 мар 2020, 10:53

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

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

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

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

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

Bezliky
Сообщения: 2
Зарегистрирован: 19 июн 2021, 22:43

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

Сообщение Bezliky » 19 июн 2021, 22:47

Спасибо тебе большое, очень хорошие уроки. Каптча при регистрации на форуме особенно улыбнула.

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

Bezliky
Сообщения: 2
Зарегистрирован: 19 июн 2021, 22:43

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

Сообщение Bezliky » 19 июн 2021, 22:49

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

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

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

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

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

An12
Сообщения: 2
Зарегистрирован: 25 июн 2021, 15:29

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

Сообщение An12 » 19 сен 2022, 17:02

Чтобы получить 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);
    }

Ответить