0

アクティビティに 1000 個を超えるボタンがあるプロジェクトがあります。データベースから色情報を取得した後、これらのボタンの背景色を更新しています。このプロセス全体は非常に大きなプロセスであり、アクティビティを読み込むのに 8 秒かかりました。そのために Asynctask を実装しましたが、「ビュー階層を作成した元のスレッドのみがそのビューに触れることができる」ため、問題はこの例外にあります。私の長い操作は、UI要素を更新している部分にあるためです

その後、UI要素を更新するためにUIthreadで実行されるスレッドを実装しました。これはその機能に従って正常に機能し、このスレッドはUIを更新しますが、アプリケーションを5〜6秒間スタックさせます。そして、その 5 ~ 6 秒間、進行状況ダイアログを実装することを考えました。しかし、runOnUiThread(new Runnable(){} で進行状況ダイアログを実装すると機能しません。UI の更新と進行状況ダイアログが同時に実行されるためです。進行状況ダイアログは数ミリ秒間点滅します。アクティビティはそれと同じままです。更新に時間がかかった場合、UI の更新に使用するかどうかはわかりません。

これは、データベースから ui 要素で更新するコードです。

            for (int i = 0; i < list.size(); i++) {

                Button btn = list.get(i);
                Platform p = db.setplatformncolor(btn.getTag().toString());
                String color = p.getColor();


                if (color.equals("red")) {
                    btn.setBackgroundColor(Color.RED);
                }


                if (color.equals("green")) {

                    btn.setBackgroundColor(Color.rgb(0, 176, 80));

                }

どんな助けでも大歓迎です。ありがとう。!!

4

5 に答える 5

1

for ループには 2 つの長い時間がかかります。ループをスレッドに配置し、UI スレッドに setBackgroundColor を配置してみてください。

new Thread(new Runnable() {
    @Override
    public void run() {
        for (int i = 0; i < list.size(); i++) {

            final Button btn = list.get(i);
            Platform p = db.setplatformncolor(btn.getTag().toString());
            String color = p.getColor();


            if (color.equals("red")) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        btn.setBackgroundColor(Color.RED);
                    }
                });
            }


            if (color.equals("green")) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        btn.setBackgroundColor(Color.rgb(0, 176, 80));
                    }
                });

            }
        }
    }
}).start();
于 2016-10-25T11:12:22.827 に答える
0

AsyncTask で問題を解決できます。このコードで最も時間のかかる操作は次のとおりです。

db.setplatformncolor(btn.getTag().toString());

したがって、この行をメソッドに移動する必要がありdoInBackground()、DB 呼び出しに追加した後、このメソッドでボタンの背景をpublishProgress()実装して変更する必要がありますonProgressUpdate()

于 2016-10-25T11:14:41.887 に答える
0

これは、初心者にとっては少しトリッキーで複雑なソリューションかもしれませんが、効率的で要件に適用できます。

Android は、XML を動的に更新する DataBinding Library を開始しました。試してみてください

https://developer.android.com/topic/libraries/data-binding/index.html

于 2016-10-25T11:17:05.903 に答える
0

このように緑のボタンのテーマと赤のボタンのテーマを宣言できます

<style name="RedButton" parent="@android:style/Widget.Button">
    <item name="android:background">@android:color/holo_red_light</item>
</style>

<style name="GreenButton" parent="@android:style/Widget.Button">
    <item name="android:background">@android:color/holo_green_light</item>
</style>

あとはテーマを適用するだけです。システムは自動的にすべてのボタンに背景色を適用します。テーマの切り替えについて詳しく知りたい場合は、こちらを参照してください。

于 2016-10-25T11:12:52.120 に答える