我有一个项目,一个活动有超过1000个按钮。在从数据库中获取颜色信息后,我正在更新这些按钮的背景色。这整个过程是一个非常大的过程,花了8秒来加载我的活动。我已经为此实现了Asynctask,但问题是这个例外,因为“只有创建视图层次结构的原始线程才能触摸其视图”。因为我的长时间操作是在上进行的,所以我正在更新UI元素
在此之后,我实现了一个运行在UIthread上的线程来更新ui元素,根据它的功能,这个线程可以很好地工作,这个线程更新我的ui,但是它会将我的应用程序阻塞5-6秒。然后我想在5-6秒内实现一个进度对话框。但是,如果我在runOnUiThread上实现进度对话框(new(){}),它就不能工作。因为更新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));
}
任何帮助都是非常感谢的。谢谢!
发布于 2016-10-25 11:12:22
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-25 11:12:52
您可以声明绿色按钮主题和红色按钮主题,如下所示
<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。
发布于 2016-10-25 11:14:41
AsyncTask可以解决您的问题。这段代码中最耗时的操作是
db.setplatformncolor(btn.getTag().toString());
因此,您必须将这一行移动到doInBackground()
方法中,在添加到DB调用publishProgress()
之后,还应该实现onProgressUpdate()
,并在此方法中更改按钮背景。
https://stackoverflow.com/questions/40238198
复制相似问题