Как запустить диспетчер работы при подключении Wi-Fi в android?

У меня есть приложение, которому необходимо синхронизировать данные, как только на устройстве будет подключен Интернет.

У меня есть синхронизация в классе Worker, и она работает нормально. Но мне нужно запустить этот класс, как только в телефоне будет подключен Интернет. Поскольку широковещательный приемник при изменении соединения не рекомендуется и не рекомендуется, мне нужен способ запустить мой класс при подключении к Интернету, чтобы данные синхронизировались. Как я могу этого добиться?

Я также подумал о том, чтобы запланировать диспетчер работы, когда пользователь существует приложение, и поддерживать состояние подключения к Интернету, но когда приложение закрывается с недавнего времени, onDestroy не вызывается. У вас есть какое-нибудь решение или логика для этого, пожалуйста?


person simplegalaxy    schedule 29.09.2019    source источник
comment
Как вы можете проверить здесь, в Документах Google: developer.android.com/topic/libraries/ архитектура / workmanager - ›WorkManager предназначен для отложенных задач, то есть не требующих немедленного запуска и требующих надежной работы даже в случае выхода приложения или перезапуска устройства. Это означает, что запрос будет выполнен, но, возможно, не сразу, а также минимальное время в PeriodicWorkRequest составляет 15 минут.   -  person MrVasilev    schedule 29.09.2019
comment
Привет, спасибо за ответ, спасибо за эту часть, но я сделал это, у меня отлично работает диспетчер работы, но важная вещь, которой мне не хватает, - это то, что мне нужно запускать этот диспетчер работы, когда сеть подключена каждый раз. Итак, где мне поставить этот запрос в очередь.   -  person simplegalaxy    schedule 29.09.2019


Ответы (2)


Мальчик понял вашу точку зрения. То, что вы указали, совершенно верно, что вы должны стараться избегать широковещательных приемников для такой ситуации, поскольку люди в наши дни имеют большое количество приложений, и каждый запрос на запуск приложения после подключения к Интернету приведет к зависанию системы пользователя, поскольку каждое приложение хочет отправить запрос после подключения Wi-Fi. Таким образом, система Android поставляется с JET PACK, после чего вы не должны выполнять действие своего приложения, а запрашивать это действие в системе Android, и они будут обрабатывать фоновый запрос.

Как упомянул Саид выше, идите с

Constraints constraints = new Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.CONNECTED)
                    .build(); 
OneTimeWorkRequest onetimeJob = new OneTimeWorkRequest.Builder(YourJob.class)
                    .setConstraints(constraints).build(); // or PeriodicWorkRequest
WorkManager.getInstance().enqueue(onetimeJob);

Но подождите, вы хотите запустить работу при подключении к Интернету, поэтому вы хотите что-то вроде устаревшей трансляции для изменения подключения. Почему ты не делаешь что-то одно? Каждый раз, когда вы получаете данные, когда пользователь находится на переднем плане или в фоновом режиме, запускайте диспетчер работы. Если вы используете его дооснащение, он возвращает ошибку, когда нет подключения к Интернету, поэтому вы можете запланировать задание, когда сбой вызван сетью.

Так ты работаешь будешь

  override fun onFailure(call: Call<Chat>, t: Throwable) {
                 Log.v("chatsyncchecking","sending message failed",t)

                 if(t is IOException){
                     Log.v("chatsyncchecking","scheduling chat sync")
                     (app as App).enqueueChatSync()
                 }
             }

(Вы можете запускать каждый запрос из класса приложения)

Таким образом, это дает вам преимущество в том, что вам не следует увольнять менеджера по работе всякий раз, когда подключен Интернет. Просто вы стреляете, когда какая-то задача терпит неудачу. Это также делает меньше запросов на работу для системы Android. В конце концов, мы все являемся сообществом, которое помогает улучшить Android, а пользователи получают большой опыт работы с телефоном без особых задержек. Надеюсь, это поможет

person Sháilèndra Wregmi    schedule 29.09.2019
comment
О боже, ваш ответ был настолько плавным, что мне понравилось письмо, написанное профессиональным документалистом. И еще кое-что, что я использовал дооснащением, и это помогло мне получить хорошую идею. - person simplegalaxy; 29.09.2019

Из-за новых ограничений для Android O и выше вы не можете запустить свой класс сразу после того, как сетевое соединение станет активным, с помощью флагов манифеста. Но вы можете приказать Workmanager запустить свою работу, как только появится подключение к Интернету.

Для этого вам нужно определить ограничение:

 Constraints constraints = new Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.CONNECTED)
                    .build(); 

А затем поставьте свою работу в очередь:

OneTimeWorkRequest onetimeJob = new OneTimeWorkRequest.Builder(YourJob.class)
                    .setConstraints(constraints).build(); // or PeriodicWorkRequest
WorkManager.getInstance().enqueue(onetimeJob);
person Saeed Masoumi    schedule 29.09.2019
comment
Привет, спасибо за ответ, спасибо за эту часть, но я сделал это, у меня отлично работает диспетчер работы, но мне не хватает важной вещи, так это то, что мне нужно запускать этот диспетчер работы, когда сеть подключена каждый раз. Итак, где мне поставить этот запрос в очередь. - person simplegalaxy; 29.09.2019
comment
@simplegalaxy Вы имеете в виду, что хотите вызывать это задание каждый раз при подключении к сети? - person Saeed Masoumi; 29.09.2019
comment
@SaeedMasoumi На ваш ответ: вызывается ли задание каждый раз при подключении к сети? - person William; 04.03.2020