какой способ лучше в Android, JobScheduler или использовать таймер? - PullRequest
3 голосов
/ 03 октября 2019

Я разрабатываю приложение чата. Для получения новых сообщений в режиме реального времени мы используем сервис переднего плана. (из-за какой-то ситуации мы не можем использовать FCM) Чтобы быть уверенным, что клиенты подключены к серверу, мы отправляем пинг на сервер каждую минуту с помощью JobScheduler. Теперь у нас есть проблема с использованием батареи. Лучше использовать CountDownTimer, как показано ниже, в нашем сервисе переднего плана:

CountDownTimer countDownTimerPingPeriodic;
public static boolean isPinging;

public void pingPeriodic(boolean fromService) {

    if (countDownTimerPingPeriodic != null) {
        countDownTimerPingPeriodic.cancel();
        countDownTimerPingPeriodic = null;
    }


    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            long future = 75000;
            countDownTimerPingPeriodic =

                    new CountDownTimer(60000, 60000) {

                        @Override
                        public void onTick(long l) {

                        }

                        @Override
                        public void onFinish() {
                            sendPing(false);
                            pingPeriodic(false);

                        }
                    };
            isPinging = true;
            countDownTimerPingPeriodic.start();

        }
    });

}

или лучше использовать службу заданий, например, ниже (теперь мы используем ниже код и отправляем пинг в onStartJob):

public class ScheduleConnectionJob extends JobService {

private static final String TAG = "ScheduleConnectionJob";
private int i = 0;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return Service.START_STICKY;
}

@Override
public boolean onStartJob(JobParameters params) {

    //here I will send a ping to the server

    jobFinished(params, true);
    Util.scheduleJob(getApplicationContext()); // reschedule the job
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    Util.scheduleJob(getApplicationContext());
    return true;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Util.scheduleJob(getApplicationContext());
}}

И чтобы позвонить и повторить эту услугу Мы используем ниже код для повторения каждую 1 минуту:

public class Util {

public static final long MinimumSchadulePeriodic = 15 *  60 * 1000 ;
// schedule the start of the service every 10 - 30 seconds
public static void scheduleJob(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        ComponentName serviceComponent = new ComponentName(context, ScheduleConnectionJob.class);

        JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);

        FileLog.i("Util:",
                Thread.currentThread().getStackTrace()[2].getLineNumber() + " " +

                        "scheduleJob:scheduleJob");
        builder.setMinimumLatency(MinimumSchadulePeriodic); // wait at least
        builder.setOverrideDeadline(60 * 1000); // maximum delay

        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); // require unmetered network

        JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

        if (jobScheduler != null) {
            jobScheduler.schedule(builder.build());
        }
    }
}}

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вы также можете использовать WorkManager, если он будет лучше в вашем случае, вместо JobScheduler.

API WorkManager позволяет легко планировать отложенные асинхронные задачи, которые, как ожидается, будут выполняться, даже если приложение закрывается или устройствоrestarts.

Ознакомьтесь с этой официальной документацией для получения дополнительной информации :: https://developer.android.com/topic/libraries/architecture/workmanager/

Также прочитайте эту статью https://medium.com/androiddevelopers/introducing-workmanager-2083bcfc4712

1 голос
/ 03 октября 2019

Если вы не поддерживаете ниже SDK 14, вы можете использовать workmanager . В противном случае см. Это руководство , чтобы прочитать обо всех вариантах.

Некоторые дополнительные ресурсы по управлению батареями: Дозировка и режим ожидания , ограничения управления питанием , Анализ энергопотребления , Чрезмерное количество пробуждений , Чрезмерное использование сети в фоновом режиме

Надеюсь, это немного поможет вам. Я должен сказать, что ваше приложение пингует бэкэнд каждую минуту, кажется немного. Если не важно, чтобы ваши пользователи получали свои сообщения сразу же после отправки, может быть лучше хотя бы увеличить это до 5 или 10 минут в фоновом режиме.

...