2017-03-03 9 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の操作は1回です。それは眠らず、待っている。

以下は、固定価格で株価を更新するためのコードです。

// 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。私はいつも "家庭用ウィジェット"という言葉を使って顧客と話します。私はそれを "app widget"に戻します。 –

答えて

2

AppWidgetProviderは、BroadcastReceiverのサブクラスです。コールバック(例:onUpdate())が返されると、いつでもプロセスを終了することができます。あなたは、あなたがやっている半アニメーションを完了するために失敗した場合それが問題—されていない場合

は、それは仕事ができるExecutoronUpdate()からを使用して— OKです。

テキストの変更が完了するようにするには、Executorを使用するServiceにアプリウィジェットの更新を委任します。処理が完了したらをServiceに電話してください。そのため、処理が途切れることはなく、人為的に処理を続けることはできません。

+0

申し訳ありません。あなたが 'onUpdate'で' executor.execute'を実行すると、 "あなたのコールバック(例えば、onUpdate())が返ったら、あなたのプロセスは次のように動作します。いつでも終了することができます」。 –

+1

@CheokYanCheng:正しい。私はあなたの質問のNが低い(数秒)ことを望んでおり、テキストの総数も少ない(いくつかの値は、このMと呼ぶ)。完了するためにあなたのセットアップされたアップデートのためにM * N秒間あなたのプロセスが必要です。しかし、 'onUpdate()'が返されると、あなたのプロセスはいつでも離れて、おそらくM * N秒が経過する前に消えることがあります。 – CommonsWare

+0

はい。 Nは数秒です。 Mは5未満でなければならない。 –

0

まあ、singleThreadインスタンスの作業では、単一のワーカースレッドを使用するExecutorが作成されます。あなたの操作を処理するスレッドだけを意味します。しかし、あなたの場合は、少なくとも2つを使用してください。あなたの操作は高価に思えます。 あなたの質問はスレッドセーフであるため、エグゼキュータサービスに固執してください。

関連する問題