11

0.1秒ごとにアクティビティにインテントを送信するサービスがあります。クロノメーターのカスタム実装を更新するために使用します。ここですべてがうまくいきます。問題は、アクティビティのフラグメント内のTableViewにある14個のTextViewを更新するときに発生します。ここでアプリは非常に遅いです。

サービスからインテントを受け取るアクティビティのメソッド:

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        long milis = intent.getLongExtra("milis",0);
        if( mFragment != null)
        mFragment.Update(milis);
    }
};

TextViewsを更新するフラグメント内のコード:

public void actualizarTiempoJuego(long milis){
    // Se recuperan los tiempos acumulados y se aumenta la cantidad pasada como parámetro
    for(int i=0;i<7;++i) {
        long mCurrentMilis1 = mVectorMilis1.get(i);
        long mCurrentMilis2 = mVectorMilis2.get(i);
        TextView1 t1 = mListaTitularLayoutLocal.get(i);
        TextView1 t2 = mListaTitularLayoutVisitante.get(i);
        t1.setText(String.value(milis + mCurrentMilis1));
        t2.setText(String.value(milis + mCurrentMilis2));
    }
}

私は何か間違ったことをしているのですか、それとも効率の点で非常に複雑なことをしようとしているだけですか?

4

6 に答える 6

7

@Sherifは、アプリケーションを大きく悩ませている隠れたアルファ値についての良い点を示しています。プラットフォームによっては、確認することもできます

<application android:hardwareAccelerated="true"... />

パフォーマンスに役立つ可能性のあるもう1つの調査は、これらすべてのインテントを実行することではありません。インテントの起動を開始すると、システムが関与し、それらがどのように解決されるかによっては、さらに時間がかかる場合があります。

この問題では、ハンドラーを使用するのが好きです。それらは意図よりも軽量です。AsyncTaskも確認することをお勧めします。これは基本的にスレッドに似ていますが、UIスレッドで実行されるフックも提供するため、ランナブルを投稿しなくても、バックグラウンド操作の実行とUIの更新の両方を実行できます。

編集:最後に、 layoutoptツールを使用していつでもレイアウトを実行できます。Romain Guy自身から、描画が遅すぎる場合は、描画を少なくする必要があると個人的に言われました。プロファイリングツールからスクリーンショットをチェックしてください(理想的ではないビューツリーからですが、最大範囲内です)。ビュー図面が占めるリソースの量を確認できます。アプリの応答性を高めるには、これを可能な限り無駄のないものにすることが非常に重要です。 プロファイリングビュー図面リソースの消費

編集:それはもはやlayoutoptとは呼ばれず、lintと呼ばれます。〜/ android-sdk /tools/を確認してください

于 2012-06-19T20:52:02.610 に答える
5

私はかつてフラグメントが本当に遅いという状況に直面しました。

私はあなたのフラグメントが何らかのアルファを持っていて、それが「重い」活動に描かれていると予測しています。

結論として、テキストビューのテキストを設定するたびに、ビュー階層全体が無効になります。

フラグメントにはこの欠陥があるようです。とにかく、フラグメントの代わりにいくつかのレイアウトを使用して、それが「遅い」ままであるかどうかを確認します。


追加:wrap_content textviewは、fill_parenttextviewよりも後にはるかに多くの遅延を引き起こしsetTextます。

于 2012-06-19T20:44:37.953 に答える
3

TableLayoutとTextViewを使用したレイアウト管理が原因で、速度が低下する可能性があります。これらのいずれかのテキストを更新するたびに、画面上の適切な場所に文字を配置するために、大量のビュー測定を実行する必要があります。Traceviewを使用して、自分でアプリのプロファイルを作成する必要があります。詳細については、http://developer.android.com/tools/debugging/debugging-tracing.htmlをご覧ください。

同じタイプのレイアウト([フラグメント]>[テーブルレイアウト]>[複数のTextView])で発生しているのとまったく同じ問題が発生しました。TableLayout / TextViewの設定が原因であるかどうかをテストする1つの方法は、すべてを1つのTextViewに置き換えることです。それはおそらくかなりうまくいくでしょう。次に、14個のビューをFrameLayoutまたはRelativeLayoutに配置します。それらがすべて重複している場合でも、TableLayoutビューの測定が複雑であるために実際に速度が低下するため、適切なパフォーマンスが得られるはずです。

于 2012-06-21T19:31:34.267 に答える
0
  • あなたはループの外で変数を宣言することを試みることができます:

    public void actualizarTiempoJuego(long milis){
        // Se recuperan los tiempos acumulados y se 
        // aumenta la cantidad pasada como parámetro
    
        long mCurrentMilis1;
        long mCurrentMilis2;
        TextView1 t1;
        TextView1 t2;
    
        for(int i=0;i<7;++i) {
            mCurrentMilis1 = mVectorMilis1.get(i);
            mCurrentMilis2 = mVectorMilis2.get(i);
            t1 = mListaTitularLayoutLocal.get(i);
            t2 = mListaTitularLayoutVisitante.get(i);
            t1.setText(String.value(milis + mCurrentMilis1));
            t2.setText(String.value(milis + mCurrentMilis2));
        }
    }
    
  • そしてsetText()、混合タイプで、あなたは試すことができますsetText("" + milis + mCurrentMilis2);

于 2012-06-26T15:47:48.657 に答える
0

誰かがHardwareAcceleratedを使用できると言ったが、これは優れたソリューションではないため、別の方法で解決できない場合は、RAMとCPUを浪費することになります。おそらくより安全な解決策は、TextViewの数を減らすことです。14から7に減らすようにしてください。そうすれば、2倍速くなります。通常、それを行うのは困難ですが、オブジェクトを戦略位置に配置する場合、2行のTextViewを作成すると、TextViewのペアを上下に並べることができます。また、findViewByIdは非常に高価であることを忘れないでください。ビューオブジェクトを使用する場合は、ビューオブジェクトを一度見つけて、その参照を保持することがよくあります。

于 2012-06-25T23:58:06.310 に答える
0

ベンチマークは、速度が実際にどこから来ているのかを判断するのに常に役立ちますが、インテントの送信は、14個のTextViewを更新するよりもおそらくはるかに遅いことを示唆していると確信しています。1秒あたり10インテントを送信することは、あなたがそれを間違っている(TM)ことを示しています。これは彼らの目的ではありません。

私は何か間違ったことをしているのですか、それとも効率の点で非常に複雑なことをしようとしているだけですか?

1秒あたり14個のTextViewを更新することは、本質的に複雑ではありません。より適切なアプリケーション設計でこれを簡単に達成できるはずです。ASyncTaskまたはHandlerが可能なツールとして思い浮かびますが、何をしようとしているのかを正確に知らなければ、何が最善かを知ることは困難です。

于 2012-06-26T00:20:33.013 に答える