NetworkType.UNMETERED против NetworkType.METERED - PeriodicWork

в моем приложении я использую диспетчер работ для периодической работы. Я загружаю файлы на сервер. У меня есть одна кнопка при нажатии этой кнопки, появляется одно диалоговое окно и спрашивают пользователя - Какую сеть вы хотите использовать при загрузке файла - 1. Wi-Fi 2. Любая

Если пользователь нажимает на Wi-Fi, я загружаю файл каждые 30 минут. Если пользователь нажимает «Любой», я загружаю файл через каждые 1 час.

Ниже приведен мой код для этого: 1. Если пользователь выбирает WIFI

PeriodicWorkRequest.Builder wifiWorkBuilder =
                            new PeriodicWorkRequest.Builder(FileUpload.class, 30,
                                    TimeUnit.MINUTES)
                                    .addTag("WIFIJOB1")
                                    .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.UNMETERED).build());
                    wifiWork = wifiWorkBuilder.build();
                    WorkManager.getInstance().enqueueUniquePeriodicWork("wifiJob", ExistingPeriodicWorkPolicy.REPLACE, wifiWork);

Если Пользователь выбирает Любой:

PeriodicWorkRequest.Builder mobileDataWorkBuilder =
                                new PeriodicWorkRequest.Builder(FileUpload.class, 1,
                                        TimeUnit.HOURS)
                                        .addTag("MOBILEDATAJOB1")
                                        .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build());
                        mobileDataWork = mobileDataWorkBuilder.build();
                        WorkManager.getInstance().enqueueUniquePeriodicWork("mobileDataJob", ExistingPeriodicWorkPolicy.REPLACE, mobileDataWork);

Для любой сети он работает отлично и загружает apk через каждые 1 час. Но если пользователь выбирает Wi-Fi, то вот проблема -

Если пользователь подключен к Wi-Fi другого мобильного телефона (скажем, он использует точку доступа), то здесь сеть, я думаю, считается сетью с измерителем, поэтому он не будет загружать файл. Я просто хочу знать, что наша домашняя или офисная сеть по умолчанию является сетью без счетчика или нет. Если предположить, что это не исправлено (означает, что некоторые из них измеряются, а некоторые не измеряются), то с помощью этого кода, если пользователь выбирает Wi-Fi, а пользователь Wi-Fi считается измеряемым, файл с его устройства никогда не будет загружен.

Или я должен создать другую задачу, например:

PeriodicWorkRequest.Builder meteredwifiWorkBuilder =
                            new PeriodicWorkRequest.Builder(FileUpload.class, 45,
                                    TimeUnit.MINUTES)
                                    .addTag("METEREDWIFIJOB")
                                    .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.METERED).build());
                    wifiWork = wifiWorkBuilder.build();
                    WorkManager.getInstance().enqueueUniquePeriodicWork("meteredwifiJob", ExistingPeriodicWorkPolicy.REPLACE, wifiWork);

Таким образом, если пользователь, не подключенный к Wi-Fi, файл будет загружаться через каждые 1 час, если он подключен к Wi-Fi (без счетчика), файл будет загружаться через каждые 30 минут, а если он подключен к Wi-Fi с лимитом, файл будет загружаться через каждые 45 минут.

Приведенная выше логика имеет смысл создать 3 отдельные задачи для загрузки файла. Любое предложение будет оценено. заранее спасибо


person PPD    schedule 12.09.2018    source источник


Ответы (1)


Если все, что вам нужно, это наличие сетевого подключения, просто используйте NetworkType.CONNECTED. Если файл очень большой и может дорого обойтись пользователю (поскольку в конечном итоге он будет использовать дорогостоящее соединение для передачи данных), вам следует использовать NetworkType.UNMETERED.

person Rahul    schedule 26.05.2019
comment
Спасибо, Рахул, однако было бы полезно узнать, как определяется UNMETERED. Например, если у пользователя есть безлимитный тарифный план, он по-прежнему unmetered? - person Ben Butterworth; 09.12.2020