0

我有一个项目,其中一个活动有超过 1000 个按钮。从数据库中获取颜色信息后,我正在更新这些按钮的背景颜色。这整个过程是一个非常大的过程,加载我的活动需要 8 秒。我已经为此实现了 Asynctask,但问题在于这个例外,因为“只有创建视图层次结构的原始线程才能触及它的视图”。因为我的长期操作是在我更新 UI 元素的那部分

之后我实现了一个在 UIthread 上运行以更新 ui 元素的线程,根据它的功能,这工作正常,这个线程更新了我的 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 循环需要两个很长时间,尝试将循环放在线程中,并将 setBackgroundColor 放在 ui 线程中。

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

您可以像这样声明一个绿色按钮主题和一个红色按钮主题

<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 回答
0

AsyncTask 可以解决您的问题。这段代码中最耗时的操作是

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

所以你必须将此行移动到doInBackground()方法中,并且在添加到 DB 调用之后,publishProgress()你还应该onProgressUpdate()在此方法中实现和更改按钮背景

于 2016-10-25T11:14:41.887 回答
0

对于初学者来说,这可能有点棘手和复杂,但有效且适用于您的要求。

Android 推出了 DataBinding 库,它会动态更新你的 XML,试试吧

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

于 2016-10-25T11:17:05.903 回答
0

如果您的应用程序 api 级别 >=11 并且您只需要两种颜色,那么您可以为按钮的背景创建一个可绘制的 xml,例如:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/red" android:state_activated="false" />
<item android:drawable="@color/green" android:state_activated="true"/>

然后改变btn.setActivated(true/false);

于 2016-10-25T11:31:01.693 回答