如果我在 android 中有长时间更新 ui 线程,该怎么用

what to use if i have long updating ui thread in android

我有一个项目 activity 有超过 1000 个按钮。从数据库中获取颜色信息后,我正在更新这些按钮的背景颜色。这整个过程是一个非常大的过程,花了 8 秒来加载我的 activity。 我已经为此实现了 Asynctask,但问题在于此异常,因为 "Only the original thread that created a view hierarchy can touch its views"。因为我的长期操作是在那部分 我正在更新我的 UI 元素

之后,我实现了一个在 UI 线程上运行的线程,用于更新 ui 元素,根据它的功能,这工作正常,这个线程更新了我的 ui 但它卡住了我的应用程序需要 5-6 秒。然后我想在 5-6 秒内实现一个进度对话框。但是如果我在 runOnUiThread(new Runnable(){} 上实现进度对话框它不起作用。因为更新 ui 和进度对话框同时运行。所以进度对话框闪烁几毫秒。activity 仍然和以前一样。 如果他们花了很长时间更新,我不知道用于更新 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));

                }

感谢任何帮助。 谢谢。!!

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();

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

<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>

然后应用主题。系统将自动为所有按钮应用您的背景颜色。如果需要有关主题切换的更多详细信息,请参阅 here

A​​syncTask 可以解决您的问题。此代码中最耗时的操作是

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

所以你必须将这一行移到 doInBackground() 方法中,在添加到数据库调用后 publishProgress() 你还应该实现 onProgressUpdate() 并在此方法中更改你的按钮背景

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

Android 已启动数据绑定库,它将动态更新您的 XML,试试看

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

如果您的应用 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);