gpt4 book ai didi

java - Android 在哪里创建 ScheduledThreadPool 以及如果不关闭会发生什么?

转载 作者:行者123 更新时间:2023-12-02 05:25:30 25 4
gpt4 key购买 nike

我正在创建一个 ScheduledThreadPool 来定期运行一些方法调用。举个例子,我想每 10 秒将所有内容保存到数据库中......所以我得到了:

public class Scheduler{
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(5);

public Scheduler(){
foo = Foo.getInstance();

saveValues();
}

private void saveValues(){
ScheduledFuture saveValues = scheduledExecutorService.scheduleAtFixedRate(
new Runnable(){
public void run() {
Log.e(TAG, "in save values");

foo.save();
}
}, 2000, 2000, TimeUnit.MILLISECONDS);
}
}

但问题是它运行一次就再也不会了。我在一篇教程中读到,关闭执行器非常重要,否则它可能会永远运行,所以我预计除了创建它并在以下位置关闭它之外,我不需要关心它的生命周期:一分。

Foo 是一个 Api,它是一个单例。它由 activity 调用并调用 Scheduler。我也想知道是否应该扩展应用程序,但尚未发现有必要。

我需要在我的应用程序中的哪个位置调用它,在 Scheduler 类中是否可以? Scheduler 必须是 Runnable 吗?我到底在哪里关闭执行器?

提前致谢

ps:如果您认为执行器不是正确的方法,请告诉我。我浏览了许多线程和页面,但没有找到完美的答案,因此执行器似乎没问题。

最佳答案

它应该只绑定(bind)到一个 Activity 吗?即使 Activity 被破坏,您仍然需要应用程序中的功能吗?

我做了这样的功能扩展服务。这是代码:

public class MyService extends Service {

static final public String SERVICE_RESULT = "com.my.app.MyService.SMS_UPDATED";
static final public String SERVICE_MESSAGE = "SMS updated";

int SECONDS = 10;

LocalBroadcastManager broadcaster;

ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(5);


@Override
public int onStartCommand(Intent intent, int flags, int startId) {


ScheduledFuture scheduledFuture =
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {

// do some processing... and then

sendResult(SERVICE_MESSAGE);

}
}, SECONDS, SECONDS, TimeUnit.SECONDS);

return Service.START_STICKY;

}

@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
super.onCreate();
broadcaster = LocalBroadcastManager.getInstance(this);

// if you need any initialization...
}


public void sendResult(String message) {
Intent intent = new Intent(SERVICE_RESULT);
if (message != null)
intent.putExtra(SERVICE_RESULT, message);
broadcaster.sendBroadcast(intent);
}
}

因此,我使用 Intent 将处理结果传达回我的应用程序。通过使用 scheduleAtFixedRate 我能够每 10 秒运行一次任务,您应该根据需要对其进行修改。然后,注意Service.START_STICKY;它定义是否应该重新启动服务。

您发布的代码似乎是正确的,但是,如果它在一个 Activity 中并且您在其他 Activity 中需要它......也许它正在被破坏。

关于java - Android 在哪里创建 ScheduledThreadPool 以及如果不关闭会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26080354/

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