как вызвать метод через 2 минуты в фоновом режиме - PullRequest
0 голосов
/ 27 июня 2018

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

MyService класс

public class MyService extends Service {

private static Retrofit retrofit = null;

@Override
public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public void onCreate() {
    new CountDownTimer(120000, 1000) {
        public void onTick(long millisUntilFinished) {
            Log.d("message", "start");
        }
        public void onFinish() {
            Log.d("message", "finish");

            callMyMethod();
            stopService(new Intent(MyService.this, MainActivity.class));
        }
    }.start();
}

Класс MainActivity, откуда я запускаю сервис.

stopService(new Intent(getContext(), MyService.class));
startService(new Intent(getContext(), MyService.class));

Manifest

<service android:name="MyService" android:enabled="true" android:exported="true"/>

ПРИМЕЧАНИЕ: Я ХОЧУ ВЫЗВАТЬ СЕРВИС ТОЛЬКО НА НАЖМИТЕ КНОПКУ И ОСТАНОВИТЬ СЕРВИС ПОСЛЕ 2 МИНУТ. пожалуйста, помогите решить эту проблему или если есть другое хорошее решение, кроме услуг.

Обновлено: если сетевой ответ не удался, как я могу обработать, чтобы повторить попытку.

MyService класс

public class MyService extends Service {

private static Retrofit retrofit = null;

@Override
public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public void onCreate() {
    new CountDownTimer(120000, 1000) {
        public void onTick(long millisUntilFinished) {
            Log.d("mess", "start");
        }
        public void onFinish() {
            Log.d("mess", "finish");

            selectDriverForJOb();
            stopSelf();//(new Intent(MyService.this, MainActivity.class));
        }
    }.start();
}

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

private void selectDriverForJOb() {
    SharedPreferences sharedPreferences = getSharedPreferences("Login_credentials", MODE_PRIVATE);
    String user_id = sharedPreferences.getString("userID", null);
    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    APIServices_interface selectDriver_interface = retrofit.create(APIServices_interface.class);
    Call<SelectDriverforJobResult> call = null;
    try {
        call = selectDriver_interface.selectDriverforJob(user_id);
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (call != null) {
        try {
            call.enqueue(new Callback<SelectDriverforJobResult>() {
                @Override
                public void onResponse(Call<SelectDriverforJobResult> call, Response<SelectDriverforJobResult> response) {
                    SelectDriverforJobResult selectDriver = response.body();
                    String message = selectDriver.getMessage();
                    if(!(message.equalsIgnoreCase("success"))){

                    }
                }

                @Override
                public void onFailure(Call<SelectDriverforJobResult> call, Throwable t) {
                    Log.d("mess : ", "Error Updating ");
                    //want to retry
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
}

Ответы [ 2 ]

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

переопределить onStartCommand в службе и вернуть START_NOT_STICKY, он не будет перезапускать

public void onStartCommand()
{
     return START_NOT_STICKY
}

и используйте stopSelf() insted из stopService(new Intent(getContext(), MyService.class));

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

Ваша служба не будет работать после закрытия приложения, прочитайте фоновое ограничение . И это не совсем Service вариант использования.

Решением вашей проблемы может быть AlarmManager . Установите будильник точно через 2 минуты, и ваш приемник будет вызываться при его срабатывании. Перед использованием AlarmManger прочитайте setExactAndAllowWhileIdle() и setExact().

В качестве альтернативы вы также можете использовать WorkManager, чтобы установить точное задание. Но это будет излишним, если вам не нужно Job Constraints. Так что, если ваша работа не зависит от каких-либо ограничений, таких как сетевое подключение или других, вы можете пойти с AlarmManger.

PS : - Если ваша задача зависит от сетевого подключения, вам следует использовать WorkManager. Прочитайте Расписание задач с WorkManager .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...