gpt4 book ai didi

android - 在 android , JobScheduler 或使用计时器中哪种方式更好?

转载 作者:行者123 更新时间:2023-12-02 00:50:13 24 4
gpt4 key购买 nike

我正在开发一个聊天应用程序,为了实时获取新消息,我们使用前台服务。 (由于某些情况我们不能使用 FCM)
为了确保客户端连接到服务器,我们使用 JobScheduler 每 1 分钟向服务器发送一次 ping。现在我们遇到了电池使用问题。
最好在我们的前台服务中使用 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 中发送 ping):
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());
}
}
}}

最佳答案

如果您不支持低于 SDK 14 的版本,您可以使用 workmanager .否则看这个guide阅读所有选项。

有关电池管理的一些额外资源:Doze and standby , power management restrictions , Analyzing power usage , Excessive wake-ups , Excessive network usage in background

希望这对您有所帮助。我不得不说,让你的应用每分钟 ping 一次后端似乎有点多。除非您的用户在收到消息时立即收到消息至关重要,否则最好将其在后台至少缩短到 5 或 10 分钟。

关于android - 在 android , JobScheduler 或使用计时器中哪种方式更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58215459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com