Java Android在哪里创建ScheduledThreadPool?如果不关闭会发生什么?

Java Android在哪里创建ScheduledThreadPool?如果不关闭会发生什么?,java,android,Java,Android,我正在创建一个ScheduledThreadPool来定期运行一些方法调用。 例如,我想每10秒将所有内容保存到数据库中。。。 所以我得到: public class Scheduler{ ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); public Scheduler(){ foo = Foo.getInstance();

我正在创建一个
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。它被
活动
调用,并调用
调度程序
。我还想知道它是否应该扩展应用程序,但还没有发现它的必要性

我需要在我的应用程序中的什么地方调用它,它在Scheduler类中是否正常?调度程序是否需要是可运行的?我到底在哪里关闭执行器

提前谢谢


附言:如果你认为执行者不是正确的方式,请告诉我。我浏览了很多帖子和页面,没有找到一个完美的答案,所以执行者看起来还行。

它应该只绑定到一个活动吗?您是否需要在整个应用程序中使用该功能,即使活动已被破坏

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

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);
    }
}
因此,我使用意图将处理结果传回我的应用程序。通过使用
scheduleAtFixedRate
我可以每10秒运行一次任务,您应该根据需要修改它。然后,注意服务。启动\u STICKY;它定义了服务是否应该重新启动


你发布的代码似乎是正确的,但是,如果它在活动中,而你在其他活动中需要它。。可能它正在被破坏。

尝试10秒超时的递归<代码>线程.睡眠(10000)
或类似的东西。无需使用
scheduledExecutorService
。还要确保不要在UI线程中启动该线程。尝试
class MyAsyncClass扩展AsyncTask{}
然后
new RetreivePicture().execute()我需要安排几个操作,这样一个简单的线程就不能真正执行了。回到主要问题:如何、何时、何地使用ExecuterDDoes
foo.save()
是否返回过?应该:D只保存到数据库,然后返回。但看起来您可能是对的。但它仍然让我对整个scheduledThreadPool结构的问题悬而未决。嘿,看起来相当不错,我将尝试一下。我发现的主要问题是,在我的案例中,Fildor指出,该方法从未返回,但您回答了其他一些问题,谢谢。这可以广泛使用,非常有用谢谢+1.