Необходимо создать фоновый сервис, который загружает данные, когда интернет доступен - PullRequest
0 голосов
/ 12 июня 2018

У меня есть персонализированный канал, с возможностью любить комментарии.Когда пользователь нажимает кнопку «Мне нравится», приложение проверяет интернет-соединение, если интернет доступен, API-запросы удаляются, если интернет не работает, comment_id сохраняется в БД.Я хочу, чтобы, когда интернет возобновлялся, должен был быть выполнен вызов API с этим comment_id.

I Попытка широковещательного приемника, но при изменении подключения к Интернету широковещательный приемник не инициализируется или не активируется.

Это ConnectivityReceiverкод.

public class ConnectivityReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent arg1) {
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null
            && activeNetwork.isConnectedOrConnecting();

    Log.d("LLLL",""+isConnected);
   }
}

Это мой файл манифеста.

<receiver
        android:name=".backgroundServices.ConnectivityReceiver"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Для проверки интернета вы можете использовать эту функцию.

public boolean hasInternet() {
ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
    NetworkInfo[] info = connectivity.getAllNetworkInfo();
    if (info != null)
        for (int i = 0; i < info.length; i++)
            if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                return true;
            }
}
return false;}

Эта функция вернет true, если интернет работает.Сделайте таймер, чтобы снова и снова проверять интернет, как только вы получите истинное значение от функции, выполняющей ваше соединение.

0 голосов
/ 12 июня 2018

Вы можете использовать WorkManager!

API WorkManager позволяет легко определять отложенные, асинхронные задачи и время их запуска.Эти API позволяют вам создать задачу и передать ее в WorkManager для немедленного запуска или в подходящее время.Например, приложение может время от времени загружать новые ресурсы из сети.Используя эти классы, вы можете настроить задачу, выбрать подходящие условия для ее запуска (например, «только когда устройство заряжается и подключено к сети») и передать ее в WorkManager для выполнения при выполнении условий.Задание по-прежнему гарантированно выполняется, даже если ваше приложение принудительно завершается или устройство перезагружается.

WorkManager предназначен для задач, требующих гарантии того, что система запустит их, даже если приложение выйдет, например,загрузка данных приложения на сервер.Он не предназначен для фоновой работы в процессе, которую можно безопасно прекратить, если процесс приложения завершится;для подобных ситуаций мы рекомендуем использовать

, вы даже можете установить условие, как если бы был NetworkConnection для работы Manager, и ваша задача будет выполнена при этом условии

, вот документ:

https://developer.android.com/topic/libraries/architecture/workmanager#java

0 голосов
/ 12 июня 2018

Вам нужно использовать JobScheduler для этой цели.Всякий раз, когда у вас есть какие-либо задачи, ожидающие выполнения, установите JobScheduler, и он будет выполняться, когда будут выполнены указанные условия.Условия типа

 val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler

        jobScheduler.schedule(JobInfo.Builder(111,
                ComponentName(this, UploadLikesJobService::class.java))
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .setBackoffCriteria(JobInfo.DEFAULT_INITIAL_BACKOFF_MILLIS, JobInfo.BACKOFF_POLICY_LINEAR)
                .setPersisted(true)
                .build())

Это класс UploadLikesJobService:

/**
 * Created by nileshdeokar on 09/02/2018.
 */
class UploadLikesJobService : JobService() {

    override fun onStartJob(jobParameters: JobParameters?): Boolean {
        // Call webservice here and pass the result true or false to jobFinished
        // OS will do the reschedule for you if you pass second parameter true in jobFinished() 
        jobFinished(jobParameters, false)
        return true
    }

    override fun onStopJob(jobParameters: JobParameters?): Boolean {

        return true
    }
}
...