gpt4 book ai didi

java - 重复发送 HTTP 请求,即使应用程序在 Android 上处于后台时也是如此

转载 作者:行者123 更新时间:2023-12-01 19:05:57 27 4
gpt4 key购买 nike

几天前我构建了自己的网络应用程序。除此之外,我还内置了一个过滤器,它会阻止一些内容并需要验证。 API 可让我连接到我的网络应用程序,然后我可以删除或确认内容。考虑到这一点,我开发了一个 Android 应用程序,只为了我自己,能够尽快处理所有内容。此外,应用程序应该能够立即查看网络服务器是否崩溃(因为我对网络开发还很陌生,这种情况发生的频率比我希望的要高)。

我现在的目标是在手机的通知栏中有一个永久横幅,以向我显示网络应用程序的状态(是否启动,以及我有多少待处理的请求。)这就是为什么我不想实现推送通知

我已经有一个 void 可以完成所有这些操作,但只有当我按下应用程序内的按钮时。如果我将其关闭,它就永远不会更新。

到目前为止我的代码结构:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {

//Get the button

reloadButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(final View view){
LoadInfo();
}
});
}

public void LoadInfo(){
//Handle server request
//Update the notification panel
}

所有这些(包括评论)都有效。我只需要一种像 10 分钟一样调用此方法并更新通知面板的方法。

我尝试过的:

//Inside the onCreate method
AlarmManager alarmMgr;
Intent intent = new Intent(this, com.purplepandagamestudio.zivicontroller.MainActivity.class);
intent.putExtra("LoadInfo", "LoadInfo");
PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);

alarmMgr = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_FIFTEEN_MINUTES, AlarmManager.INTERVAL_FIFTEEN_MINUTES, alarmIntent);

来自Android Documentation about scheduled alarms ,我得出的结论是,闹钟可能是实现我想要的行为的最简单方法,尽管

it may not be the best choice for your app, particularly if you need to trigger network operations.

尽管有这样的说法,我认为这可能是可行的方法,因为我是唯一的用户,而且替代方案对我来说似乎相当困难。

有没有一种简单的方法可以在后台运行这个void,我该如何实现这一点,或者我是否必须以不同的方式构建我的应用程序?

编辑

就像 Sulabh Kumar 所建议的那样,我尝试实现 ScheduledThreadPoolExecuter。我的实现如下所示:

public class MainActivity extends AppCompatActivity {

public void start() throws InterruptedException{
final ScheduledThreadPoolExecutor scheduler = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(1);

final ScheduledFuture<?> getInfo = scheduler.scheduleAtFixedRate(new LoadInfoClass(), 0,2, TimeUnit.SECONDS);
scheduler.schedule(new Runnable() {
@Override
public void run() {
getInfo.cancel(true);
scheduler.shutdown();
}
}, 0, TimeUnit.SECONDS);
}

@Override
protected void onCreate(Bundle savedInstanceState) {

//Some stuff
try{
start();
}catch (InterruptedException e){
//Handle error
}

class LoadInfoClass implements Runnable{

public void run(){
//Make the request and update everything
}
}
}

这会导致以下行为:

  • 该函数在启动时被调用
  • 当我按下 new LoadInfoClass().run(); 按钮时,一切都会按预期运行
  • 但是该方法永远不会更新。 (即使我没有关闭应用程序)

我实现 ScheduledThreadPoolerExecuter 是否错误?

最佳答案

public class MainActivity extends AppCompatActivity {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);

public void start() throws InterruptedException{
executorService.scheduleAtFixedRate(new LoadInfoClass(), 0,5,
TimeUnit.SECONDS);
}

@Override
protected void onCreate(Bundle savedInstanceState) {

//Some stuff
try{
start();
}catch (InterruptedException e){
//Handle error
}

class LoadInfoClass implements Runnable{

public void run(){
//Make the request and update everything
}
}}

当 Activity 被销毁时,关闭执行器服务。

关于java - 重复发送 HTTP 请求,即使应用程序在 Android 上处于后台时也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59555492/

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