日常网络运营的最佳方式

时间:2016-08-30 09:17:06

标签: java android http alarmmanager scheduledexecutorservice

此刻我很困惑。在Android应用程序中进行日常网络操作的“正确”/“最佳”方式是什么? 伪代码:

If newDay
    HTTP Request to server
    If responseOfRequest equals something
        Do something
    If HTTP Request is unsuccessfull (no internet, server down, ...)
        Try again in 1 hour

我怎样才能实现这一目标?我考虑过JobService,但我的minSDK低于Android 5.

干杯, DDerTyp

1 个答案:

答案 0 :(得分:1)

您需要的是服务以在后台运行逻辑和警报

首先是一点理论:

https://developer.android.com/training/scheduling/alarms.html#tradeoffs

重复警报是一种灵活性有限的相对简单的机制。它可能不是您的应用程序的最佳选择,特别是如果您需要触发网络操作。设计不良的警报可能会导致电池耗尽并对服务器造成很大负担。 如果您拥有托管应用程序数据的服务器,则将Google Cloud Messaging(GCM)与同步适配器结合使用是比AlarmManager更好的解决方案。

https://developer.android.com/training/sync-adapters/running-sync-adapter.html

默认情况下,设备关闭时会取消所有警报。

您需要在应用中的某个位置设置闹钟,但需要保存一个标记,因为您不想在每次用户打开应用时设置此闹钟

if (!appSettings.isAlarmSetUp()) {
    final AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE);
    final Intent i = new Intent(context, CustomService.class);
    final Intent intentNotRepeat = new Intent(context, CustomService.class);
    final PendingIntent pi = PendingIntent.getService(context, 0, i, 0);

    am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + AlarmManager.INTERVAL_HALF_HOUR, AlarmManager.INTERVAL_DAY, pi);

    appSettings.setAlarmSetUp(true);
}

这里有关于警报的更多信息: https://developer.android.com/training/scheduling/alarms.html#type

正如您所看到的,此警报唤醒了CustomService,您可以在其中执行所有逻辑

public class CustomService extends IntentService {

    public CustomService(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // Request to server
        client.requestToServer()
                .subscribe(response -> {
                                // Successful response
                                doSomething(response);
                            }
                        },
                        error -> {
                                // Error
                                createAlarmInOneHour();
                        });
    }
}