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()代码>我需要安排几个操作,这样一个简单的线程就不能真正执行了。回到主要问题:如何、何时、何地使用ExecuterDDoesfoo.save()
是否返回过?应该:D只保存到数据库,然后返回。但看起来您可能是对的。但它仍然让我对整个scheduledThreadPool结构的问题悬而未决。嘿,看起来相当不错,我将尝试一下。我发现的主要问题是,在我的案例中,Fildor指出,该方法从未返回,但您回答了其他一些问题,谢谢。这可以广泛使用,非常有用谢谢+1.