Урок 29. WorkManager. Введение
Добавлено: 13 июн 2018, 22:09
В этом уроке знакомимся с WorkManager.
Click here to read this article!
Click here to read this article!
Добро пожаловать на форум сайта
http://forum.startandroid.ru/
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);
...
Код: Выделить всё
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();
}
}
Код: Выделить всё
contextOfApplication.startService(new Intent(getApplicationContext(), Tracker.class));
Похожая проблема. Надо попробовать в настройках телефона дать максимальные разрешения приложению и отключить для него (приложения) всякие энергосберегающие фичи от прошивки производителя. Вот сайт где можно посмотреть как: https://dontkillmyapp.com/pol писал(а): ↑13 мар 2020, 10:53Добрый день!
Делаю периодическую задачу - определение уровня зарядки батареи, координат телефона и отправки на сервер. Батарея и отправка работают без проблем, а для получения координат я использую внешний класс со статической переменной типа Location. Так вот, обновить ее из WM не получается - задача просто зависает. И в результате мы имеем при запуске WM задачи кадждый раз предыдущее значение location.
Вообще возможно в задаче WM определять координаты?
и как из задачи остановить и запустить сервис?
Получилось запустить сервис геолокации:Однако с работой Wm в фоне на некоторых устройствах (типа Самсунг, андроид 7.0) наблюдается такое поведение: если тел не подключен к зарядке и экран погашен - задачи откладываются (сервис не стартует) пока или не включить экран или не подключить зарядку. Причем, в этот момент задачи срабатывают одновременно все, то есть сервис безо всякой необходимости перезапускается многократно.Код: Выделить всё
contextOfApplication.startService(new Intent(getApplicationContext(), Tracker.class));
Зачем, ведь и так контекст передаётся в конструктор в виде параметра?Чтобы получить 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);
}