別のスレッドからの高頻度のAndroidUIスレッドの更新?

steviesama

EditTextを高速で更新して、数値がよりスムーズに流れるようにしようとしています。しかし、AsyncTask、Thread-> Runnable with handler、Timer-> TimerTask with handlerなど、テクニックとオブジェクトのさまざまな組み合わせを試しましたが、タイミングをどれだけ設定しても、うまくいかないようです。約1秒より良い。

メッセージポンプを通過しなければならないのも事実かもしれないと思いますが、よくわかりません。少なくとも250〜500ミリ秒の更新頻度を取得する方法を誰かが知っていますか?より高い周波数が望ましいですが、それでもかまいません。

更新2:カウント++以外のすべてをコメントアウトしました。編集テキストの1つをこの値で更新すると、実際に非常に高速に更新されます。したがって、updateUi()で発生していることが、速度を低下させています。何がわからない。

更新1:問題の一部である場合に備えて、プリミティブでテストするために使用していたSharedPreferencesのリアルタイムの使用法を切り替えました。パフォーマンスは同じように見えます。定期的に発生する唯一の考えは、タイマーで実行されるupdateUi()関数です。コードは以下のとおりです。これは私がすぐに更新することを期待しているものですが、そうではありません。

private void updateUi() {

    lastDate = cal;
    cal = Calendar.getInstance();

    synchronized(cal) {

        //if the current date is greater than the last stored date
        if(compareDates(cal, lastDate) > 0 && count == 0) {
            //disable timer
            calorieTimer.cancel();
            //dereference timer...probably not necessary
            calorieTimer = null;
            double bankBmr = currentBmr.getBMR() * 
                    activityLevelMultipliers[activityLevelSpinner.getSelectedItemPosition()];
            metrics.calorieBank += (int)bankBmr - metrics.caloriesEaten;
            prefsEditor.putInt("CALORIE_BANK", metrics.calorieBank);
            prefsEditor.putInt("CALORIES_EATEN", 0);
            prefsEditor.commit();
            metrics.caloriesEaten = 0;
            //update lastDate to prevent multiple calorie banking
            lastDate = cal;
            count++;
            Log.e("updateUi()", "count #" + count);
            //set up timer again
            setupCalorieTimer();
        }

        caloriesEatenEditText.setText("" + metrics.caloriesEaten);
        caloriesRemainingEditText.setText(String.format("%d", (int)activeBmr - metrics.caloriesEaten));
        bankEditText.setText("" + metrics.calorieBank);
        estimatedWeightEditText.setText(String.format("%.2f", metrics.currentWeight - metrics.calorieBank / 3500.0)) ;
        //update the time
        time.setToNow();
        //update calories available
        caloriesAvailableEditText.setText(
                String.format("%.2f", activeBmr * percentageOfDay(time) - metrics.caloriesEaten));

    } //End synchronized(cal)

} //End updateUi()

private void setupCalorieTimer() {              
    //create handler to post update back to ui thread
    final Handler handler = new Handler();          

    calorieTimer = new Timer();

    calorieTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            //post to ui thread
            handler.post(new Runnable() {
                @Override
                public void run() {
                    updateUi();
                }                   
            });     
        }           
    }, 0, 50);      
}
steviesama

最初にリストしなかった関数は、解像度が1秒しかないandroid.text.format.Timeオブジェクトを使用していることが判明しました。つまり、パフォーマンスが低下することはなく、オブジェクトが1秒に1回しか経過しなかったため、これ以上速く更新できなかった可能性があります。以下は誤警報を引き起こした最初の機能であり、2番目の機能は「修正」でした。うまくいけば、これは、パフォーマンスの低下が私のように原因であると誤って考える人に役立つでしょう。

//"caused" the problem
private double percentageOfDay(Time time) {
    //factor the hour
    double percentage = time.hour / 24f;
    //factor the minute
    percentage += time.minute / 1440f;
    //factor the second
    percentage += time.second / 86400f;     

    return percentage;
}

//This fixed the problem
private double percentageOfDay(Calendar cal) {
    //factor the hour
    double percentage = cal.get(Calendar.HOUR) / 24f;
    //factor the minute
    percentage += cal.get(Calendar.MINUTE) / 1440f;
    //factor the second
    percentage += cal.get(Calendar.SECOND) / 86400f;
    //factor the millisecond
    percentage += cal.get(Calendar.MILLISECOND) / 86400000f;

    return percentage;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

他のスレッドからのAndroidUI

分類Dev

javafx、別のスレッドからuiを更新

分類Dev

別のスレッド内からラベルを更新する

分類Dev

別のスレッドからUIを更新する

分類Dev

別のスレッドからAnchorPaneを更新するJavaFX

分類Dev

Pythonはどのくらいの頻度でスレッドを切り替えますか?

分類Dev

別のスレッドからのSWTオブジェクトの更新

分類Dev

C#DataBinding /別のスレッドからのDynamicObjectプロパティの更新

分類Dev

別のスレッド(VB.NET)WPFからの制御の更新

分類Dev

Android:別のクラスのスレッドからUIを更新する

分類Dev

Javaの別のスレッドからSWT GUIを更新する方法

分類Dev

別のスレッドvb.netから(Tの)BindingListを更新します

分類Dev

WPFの別のスレッドからImage.sourceを更新する

分類Dev

スレッドの識別

分類Dev

subscribeOn AndroidUIスレッド

分類Dev

別のスレッドからスレッドを実行する

分類Dev

スレッドを別のスレッドから起こす方法は?

分類Dev

Pythonの別のスレッドから特定のスレッドをスリープから復帰させる

分類Dev

高度にスレッド化された高頻度の使用にsoftirqが使用されるのはなぜですか?

分類Dev

別のスレッドからの Netty ChannelHandlerContext 書き込み

分類Dev

Python getch +別のスレッドからの印刷

分類Dev

別のスレッドからTextBlockをすばやく更新する

分類Dev

UI を別のスレッドから更新する C++ Windows Form アプリ

分類Dev

Android-別のスレッドのforループからプログレスバーを更新する

分類Dev

スレッドからの配列の更新

分類Dev

他のスレッドからのVB.net更新ラベル

分類Dev

AndroidUIがJDBC接続でハングする-接続が別のスレッド上にある場合でも

分類Dev

別のスレッドからデータグリッドのItemSourceを更新します

分類Dev

別のクラスからJavaスレッドに通知する

Related 関連記事

  1. 1

    他のスレッドからのAndroidUI

  2. 2

    javafx、別のスレッドからuiを更新

  3. 3

    別のスレッド内からラベルを更新する

  4. 4

    別のスレッドからUIを更新する

  5. 5

    別のスレッドからAnchorPaneを更新するJavaFX

  6. 6

    Pythonはどのくらいの頻度でスレッドを切り替えますか?

  7. 7

    別のスレッドからのSWTオブジェクトの更新

  8. 8

    C#DataBinding /別のスレッドからのDynamicObjectプロパティの更新

  9. 9

    別のスレッド(VB.NET)WPFからの制御の更新

  10. 10

    Android:別のクラスのスレッドからUIを更新する

  11. 11

    Javaの別のスレッドからSWT GUIを更新する方法

  12. 12

    別のスレッドvb.netから(Tの)BindingListを更新します

  13. 13

    WPFの別のスレッドからImage.sourceを更新する

  14. 14

    スレッドの識別

  15. 15

    subscribeOn AndroidUIスレッド

  16. 16

    別のスレッドからスレッドを実行する

  17. 17

    スレッドを別のスレッドから起こす方法は?

  18. 18

    Pythonの別のスレッドから特定のスレッドをスリープから復帰させる

  19. 19

    高度にスレッド化された高頻度の使用にsoftirqが使用されるのはなぜですか?

  20. 20

    別のスレッドからの Netty ChannelHandlerContext 書き込み

  21. 21

    Python getch +別のスレッドからの印刷

  22. 22

    別のスレッドからTextBlockをすばやく更新する

  23. 23

    UI を別のスレッドから更新する C++ Windows Form アプリ

  24. 24

    Android-別のスレッドのforループからプログレスバーを更新する

  25. 25

    スレッドからの配列の更新

  26. 26

    他のスレッドからのVB.net更新ラベル

  27. 27

    AndroidUIがJDBC接続でハングする-接続が別のスレッド上にある場合でも

  28. 28

    別のスレッドからデータグリッドのItemSourceを更新します

  29. 29

    別のクラスからJavaスレッドに通知する

ホットタグ

アーカイブ