目前,在我的主应用程序中,我正在向状态栏对象发送多个文本。
我的状态栏对象,将按顺序显示多个文本,每个显示间隔的睡眠时间为N秒。
这是我在主应用中的实现。
public synchronized void setNextText(final CharSequence text) {
if (executor == null) {
executor = Executors.newSingleThreadExecutor();
}
executor.execute(new Runnable() {
@Override
public void run() {
Fragment fragment = getTargetFragment();
if (fragment instanceof OnStatusBarUpdaterListener) {
((OnStatusBarUpdaterListener)fragment).setNextText(text);
try {
// Allow 1 seconds for every text.
Thread.sleep(Constants.STATUS_BAR_UPDATER_TIME);
} catch (InterruptedException ex) {
Log.e(TAG, "", ex);
}
}
}
});
}
现在,我想在app小部件中使用相同的行为。我想知道,在app小部件环境中推荐使用Executor
吗?如果没有,我应该用什么课来达到类似的目标?
我确实有在app小部件中使用HandlerThread
+ AlarmManager
的经验。到目前为止它运作良好。但是,runnable
完成的操作是一次。它不会睡觉和等待。
以下是我用于以固定间隔更新股票价格的代码。
// This code is trigger by AlarmManager periodically.
if (holder.updateStockPriceHandlerThread == null) {
holder.updateStockPriceHandlerThread = new HandlerThread("updateStockPriceHandlerThread" + appWidgetId);
holder.updateStockPriceHandlerThread.start();
holder.updateStockPriceWorkerQueue = new Handler(holder.updateStockPriceHandlerThread.getLooper());
holder.updateStockPriceWorkerQueue.post(getUpdateStockPriceRunnable(...
}
但是,我觉得,对于用例"按顺序显示多个文本,每个显示间隔的睡眠时间为N秒,#{1}}可能不是一个好的解决方案。想象一下,我有100个文本。必须为100个文本设置100个警报听起来不错......
答案 0 :(得分:2)
AppWidgetProvider
是BroadcastReceiver
的子类。一旦您的回调(例如,onUpdate()
)返回,您的流程就可以随时终止。
如果这不是问题 - 如果你未能完成你正在做的半动画,那就没问题 - 使用Executor
中的onUpdate()
可以正常工作。
如果您想确保文本更改完成,请将应用小部件更新委派给Service
,您可以使用Executor
。完成后,在stopSelf()
上致电Service
,这样就可以消失,而不是人为地保持您的流程。
答案 1 :(得分:0)
singleThread实例工作创建一个使用单个工作线程的Executor。仅表示处理您的操作的线程。但在你的情况下使用至少两个。你的操作听起来很贵。 总结你的问题坚持执行者服务,因为它是线程安全的。