在app widget

时间:2017-03-03 00:22:49

标签: android multithreading

目前,在我的主应用程序中,我正在向状态栏对象发送多个文本。

我的状态栏对象,将按顺序显示多个文本,每个显示间隔的睡眠时间为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个警报听起来不错......

2 个答案:

答案 0 :(得分:2)

AppWidgetProviderBroadcastReceiver的子类。一旦您的回调(例如,onUpdate())返回,您的流程就可以随时终止。

如果这不是问题 - 如果你未能完成你正在做的半动画,那就没问题 - 使用Executor中的onUpdate()可以正常工作。

如果您想确保文本更改完成,请将应用小部件更新委派给Service,您可以使用Executor。完成后,在stopSelf()上致电Service,这样就可以消失,而不是人为地保持您的流程。

答案 1 :(得分:0)

singleThread实例工作创建一个使用单个工作线程的Executor。仅表示处理您的操作的线程。但在你的情况下使用至少两个。你的操作听起来很贵。 总结你的问题坚持执行者服务,因为它是线程安全的。