如果我在 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。
AsyncTask 可以解决您的问题。此代码中最耗时的操作是
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);
我有一个项目 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。
AsyncTask 可以解决您的问题。此代码中最耗时的操作是
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);