Выполнить вызов REST из фона в Android после фиксированного интервала - PullRequest
0 голосов
/ 12 сентября 2018

Я новичок в Android, я хочу знать наиболее эффективный способ выполнения фоновой операции - простой запрос POST с телом JSON, который будет выполнен через фиксированный интервал.Что является лучшим способом, Intent Service или Async Task.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Создайте JobScheduler, как показано ниже

 public static void scheduleJob(Context context) {
        ComponentName serviceComponent = new ComponentName(context, TestJobService.class);
        JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
        builder.setMinimumLatency(1 * 1000); // wait at least
        builder.setOverrideDeadline(3 * 1000); // maximum delay
        charging or not
        JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
        jobScheduler.schedule(builder.build());
    }

Создать следующий получатель

public class MyStartServiceReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Util.scheduleJob(context);
    }
}

Зарегистрируйте получателя в манифесте Android для события BOOT_COMPLETED.

<receiver android:name="MyStartServiceReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

Создайте JobService и добавьте свой код в onStartJob

public class TestJobService extends JobService {
    private static final String TAG = "SyncService";

    @Override
    public boolean onStartJob(JobParameters params) {
        Intent service = new Intent(getApplicationContext(), LocalWordService.class);
        getApplicationContext().startService(service);
        Util.scheduleJob(getApplicationContext()); // reschedule the job
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return true;
    }

}

Подробнее см .: ссылка здесь

0 голосов
/ 12 сентября 2018

Вы можете использовать FirebaseJobDispatcher для уровня API ниже и выше Lollipop.Вот ссылка на github:

https://github.com/firebase/firebase-jobdispatcher-android

Как реализовать:

Добавьте следующее в раздел зависимостей вашего build.gradle:

    implementation 'com.firebase:firebase-jobdispatcher:0.8.5'

Создайте класс для вашей работы:

    public class MyJobService extends JobService {
        @Override
        public boolean onStartJob(JobParameters job) {
            // Do some work here

            return false; // Answers the question: "Is there still work going on?"
        }

        @Override
        public boolean onStopJob(JobParameters job) {
            return false; // Answers the question: "Should this job be retried?"
        }
    }

Добавьте это в манифест:

<service
    android:exported="false"
    android:name=".MyJobService">
    <intent-filter>
        <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
    </intent-filter>
</service>

Добавьте это в свой основной метод onCreate:

    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));

    Bundle myExtrasBundle = new Bundle();
    myExtrasBundle.putString("some_key", "some_value");

    Job myJob = dispatcher.newJobBuilder()
        // the JobService that will be called
        .setService(MyJobService.class)
        // uniquely identifies the job
        .setTag("my-unique-tag")
        // one-off job
        .setRecurring(false)
        // don't persist past a device reboot
        .setLifetime(Lifetime.UNTIL_NEXT_BOOT)
        // start between 0 and 60 seconds from now
        .setTrigger(Trigger.executionWindow(0, 60))
        // don't overwrite an existing job with the same tag
        .setReplaceCurrent(false)
        // retry with exponential backoff
        .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
        // constraints that need to be satisfied for the job to run
        .setConstraints(
            // only run on an unmetered network
            Constraint.ON_UNMETERED_NETWORK,
            // only run when the device is charging
            Constraint.DEVICE_CHARGING
        )
        .setExtras(myExtrasBundle)
        .build();

    dispatcher.mustSchedule(myJob);

Если ваше приложение предназначено для уровня API Lollipop и выше, вам следует использовать JobScheduler или WorkManager

Для рабочего менеджера:

https://codelabs.developers.google.com/codelabs/android-workmanager/

Для JobScheduler:

http://www.vogella.com/tutorials/AndroidTaskScheduling/article.html

0 голосов
/ 12 сентября 2018

Пожалуйста, перейдите по этой ссылке: https://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService

Пожалуйста, проверьте мой пример пользовательского класса ниже.Это будет выполняться каждые 2 секунды.

class CustomThreadExecutor {

    private lateinit var scheduledExecutorService: ScheduledExecutorService
    private lateinit var scheduledFuture: ScheduledFuture<*>

    init {
        //Start Scheduler as required
        startScheduler()
    }


    fun startScheduler() {
        scheduledExecutorService = Executors.newScheduledThreadPool(2)

        scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(
                { tempImageFetch() }, 0, 2, TimeUnit.SECONDS)
    }

    fun shutdownScheduler() {
        //Stop before exit the app or when necessary
        scheduledExecutorService.shutdownNow()

    }

    private fun tempImageFetch() {
        //TODO call API
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...