2017-03-03 21 views
0

目前,在我的主應用程序中,我正在向狀態欄對象發送多個文本。正在使用應用程序部件中推薦的Executors.newSingleThreadExecutor

我的狀態欄對象將按順序顯示多個文本,每個顯示間隔的睡眠時間爲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); 
       } 
      } 
     } 
    }); 
} 

現在,我想在應用程序小部件中具有相同的行爲。我想知道,在應用小部件環境中推薦使用Executor?如果不是,我應該用什麼班級來實現類似的目標?

我在使用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秒爲每個顯示間隔的睡眠時間」,AlarmManager可能不是一個好的解決方案。想象一下,我有100個文本。不得不爲100個文本設置100個警報......

+0

「家庭小工具」,你的意思是[應用小工具](https://developer.android.com/guide/topics/appwidgets/index.html)? – CommonsWare

+0

Opps。我總是使用術語「家庭小工具」與我的客戶溝通。我將其更改回「應用小部件」。 –

回答

2

AppWidgetProviderBroadcastReceiver的子類。一旦你的回調(例如,onUpdate())返回,你的過程可以在任何時候終止。

如果如果你不能完成你正在做的半動畫不是問題—,即使用ExecutoronUpdate()可以工作是確定—。

如果您想確保文本更改完成,請將應用程序窗口小部件更新爲Service,在此使用您的Executor。完成後請致電上的stopSelf(),以便它可以消失,而不是人爲地保持過程。

+0

對不起。你的意思是說,如果我在'onUpdate'中執行'executor.execute',有時可能會終止提交的runnable,由於「一旦你的回調(例如,onUpdate())返回,你的進程可以在任何時候終止。「? –

+1

@CheokYanCheng:對。我希望你的問題中的N很低(幾秒鐘),並且文本的總數也很低(一些值稱爲M)。您需要將流程放在M * N秒左右才能完成設置的定時更新。但是,一旦'onUpdate()'返回,您的進程可能會在任何時候消失,可能會在M * N秒之前消失。 – CommonsWare

+0

是的。 N將會是幾秒鐘。 M應該小於5。 –

0

那麼singleThread實例工作創建一個使用單個工作線程的Executor。意味着只有線程才能處理您的操作。但在你的情況下至少使用兩個。你的操作聽起來很貴。 總結你的問題堅持執行者服務,因爲它線程安全。

相關問題