Урок 29. WorkManager. Введение
Урок 29. WorkManager. Введение
В этом уроке знакомимся с WorkManager.
Click here to read this article!
Click here to read this article!
Последний раз редактировалось damager82 20 дек 2018, 11:55, всего редактировалось 7 раз.
-
- Сообщения: 1
- Зарегистрирован: 14 июн 2018, 12:47
Re: Урок 29. WorkManager. Введение
Замечательный материал по фактам. Хотелось бы увидеть субъективное мнение специалиста - для решения каких задач лучше подходит WorkManager, а когда лучше использовать что-то ещё.
Re: Урок 29. WorkManager. Введение
Ошибка в статье. Worker.Result. А у вас без точки
-
- Сообщения: 9
- Зарегистрирован: 11 фев 2015, 18:58
- Контактная информация:
Re: Урок 29. WorkManager. Введение
Пожалуйста обновите статью, после обновления до worker manager alfa 10 код перестал работать, всю голову сломал как починить не знаю
Re: Урок 29. WorkManager. Введение
implementation "android.arch.work:work-runtime:1.0.0-beta02"wasiliysoft писал(а):Пожалуйста обновите статью, после обновления до worker manager alfa 10 код перестал работать, всю голову сломал как починить не знаю
отправка файла
Код: Выделить всё
...
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. Введение
Очень странно: похоже, OneTimeWorkRequest запускается у меня дважды.
логи:
код активити и myWorker:
причем, при втором запуске статусы уже не приходят...
логи:
Код: Выделить всё
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
Код: Выделить всё
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. Введение
Добрый день!
Делаю периодическую задачу - определение уровня зарядки батареи, координат телефона и отправки на сервер. Батарея и отправка работают без проблем, а для получения координат я использую внешний класс со статической переменной типа Location. Так вот, обновить ее из WM не получается - задача просто зависает. И в результате мы имеем при запуске WM задачи кадждый раз предыдущее значение location.
Вообще возможно в задаче WM определять координаты?
и как из задачи остановить и запустить сервис?
Получилось запустить сервис геолокации:
Однако с работой Wm в фоне на некоторых устройствах (типа Самсунг, андроид 7.0) наблюдается такое поведение: если тел не подключен к зарядке и экран погашен - задачи откладываются (сервис не стартует) пока или не включить экран или не подключить зарядку. Причем, в этот момент задачи срабатывают одновременно все, то есть сервис безо всякой необходимости перезапускается многократно.
Делаю периодическую задачу - определение уровня зарядки батареи, координат телефона и отправки на сервер. Батарея и отправка работают без проблем, а для получения координат я использую внешний класс со статической переменной типа Location. Так вот, обновить ее из WM не получается - задача просто зависает. И в результате мы имеем при запуске WM задачи кадждый раз предыдущее значение location.
Вообще возможно в задаче WM определять координаты?
и как из задачи остановить и запустить сервис?
Получилось запустить сервис геолокации:
Код: Выделить всё
contextOfApplication.startService(new Intent(getApplicationContext(), Tracker.class));
Re: Урок 29. WorkManager. Введение
Спасибо тебе большое, очень хорошие уроки. Каптча при регистрации на форуме особенно улыбнула.
Реализовал WorkManager, но с устройствами возникают проблемы, из-за кастомизации прошивок производителями и ввода всяких энергосберегающих функций на некоторых устройствах данная библиотека не работает. Это мое первое приложение на Андроид .
Реализовал WorkManager, но с устройствами возникают проблемы, из-за кастомизации прошивок производителями и ввода всяких энергосберегающих функций на некоторых устройствах данная библиотека не работает. Это мое первое приложение на Андроид .
Re: Урок 29. WorkManager. Введение
Похожая проблема. Надо попробовать в настройках телефона дать максимальные разрешения приложению и отключить для него (приложения) всякие энергосберегающие фичи от прошивки производителя. Вот сайт где можно посмотреть как: https://dontkillmyapp.com/pol писал(а): ↑13 мар 2020, 10:53Добрый день!
Делаю периодическую задачу - определение уровня зарядки батареи, координат телефона и отправки на сервер. Батарея и отправка работают без проблем, а для получения координат я использую внешний класс со статической переменной типа Location. Так вот, обновить ее из WM не получается - задача просто зависает. И в результате мы имеем при запуске WM задачи кадждый раз предыдущее значение location.
Вообще возможно в задаче WM определять координаты?
и как из задачи остановить и запустить сервис?
Получилось запустить сервис геолокации:Однако с работой Wm в фоне на некоторых устройствах (типа Самсунг, андроид 7.0) наблюдается такое поведение: если тел не подключен к зарядке и экран погашен - задачи откладываются (сервис не стартует) пока или не включить экран или не подключить зарядку. Причем, в этот момент задачи срабатывают одновременно все, то есть сервис безо всякой необходимости перезапускается многократно.Код: Выделить всё
contextOfApplication.startService(new Intent(getApplicationContext(), Tracker.class));
Честно говоря бесит это, сам пришел с xcode, там подобной проблемы нет.
Re: Урок 29. WorkManager. Введение
Зачем, ведь и так контекст передаётся в конструктор в виде параметра?Чтобы получить 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);
}