首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我在android中有长时间更新ui线程,该使用什么?

如果我在android中有长时间更新ui线程,该使用什么?
EN

Stack Overflow用户
提问于 2016-10-25 11:00:43
回答 5查看 339关注 0票数 0

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

在此之后,我实现了一个运行在UIthread上的线程来更新ui元素,根据它的功能,这个线程可以很好地工作,这个线程更新我的ui,但是它会将我的应用程序阻塞5-6秒。然后我想在5-6秒内实现一个进度对话框。但是,如果我在runOnUiThread上实现进度对话框(new(){}),它就不能工作。因为更新ui和进度对话框同时运行。因此进度对话框会闪烁几毫秒。活动仍然和以前一样。如果需要很长的时间来更新ui,我不知道该如何使用。

这是我从数据库中通过ui元素更新的代码。

代码语言:javascript
运行
复制
            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));

                }

任何帮助都是非常感谢的。谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-10-25 11:12:22

for循环需要两段时间,尝试将循环放在线程中,setBackgroundColor放在ui线程中。

代码语言:javascript
运行
复制
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();
票数 1
EN

Stack Overflow用户

发布于 2016-10-25 11:12:52

您可以声明绿色按钮主题和红色按钮主题,如下所示

代码语言:javascript
运行
复制
<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

票数 0
EN

Stack Overflow用户

发布于 2016-10-25 11:14:41

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

代码语言:javascript
运行
复制
db.setplatformncolor(btn.getTag().toString());

因此,您必须将这一行移动到doInBackground()方法中,在添加到DB调用publishProgress()之后,还应该实现onProgressUpdate(),并在此方法中更改按钮背景。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40238198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档