Android - 使用 runOnUiThread 从线程进行 UI 更改
Posted
技术标签:
【中文标题】Android - 使用 runOnUiThread 从线程进行 UI 更改【英文标题】:Android - using runOnUiThread to do UI changes from a thread 【发布时间】:2010-10-28 10:12:07 【问题描述】:我正在使用自定义标题视图,并希望在线程工作时在标题视图中显示/隐藏进度条。
这是我的标题视图的 XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_
android:layout_
>
<Button
android:id="@+id/image_left_btn"
android:layout_
android:layout_
android:text="Back"
/>
<TextView
android:id="@+id/image_title_text"
android:layout_
android:layout_
android:layout_weight="1"
android:textSize="20dip"
android:textStyle="bold"
android:textColor="#fff"
android:layout_gravity="center"
android:gravity="center"
android:paddingLeft="8dip"
android:paddingRight="8dip"
/>
<ProgressBar
android:id="@+android:id/progress_small_title"
style="?android:attr/progressBarStyleSmall"
android:layout_
android:layout_
android:paddingRight="8dip"/>
</LinearLayout>
在我的 Activity 中,将其设置为自定义标题栏后,我会这样做
titleProgress = (ProgressBar)findViewById(R.id.progress_small_title);
titleProgress.setVisibility(View.INVISIBLE);
titleProgress 是 ProgressBar 对象。
这就是我在帖子中所做的事情
runOnUiThread(new Runnable()
public void run()
titleProgress.setVisibility(View.VISIBLE);
);
//long operation here
runOnUiThread(new Runnable()
public void run()
titleProgress.setVisibility(View.INVISIBLE);
);
但是进度条没有变化。它从不显示。谁能告诉我代码有什么问题?
是否可以在自定义标题中显示标题进度条?
谢谢。
【问题讨论】:
【参考方案1】:可以尝试的几件事:
1)(这可能不是)确保“titleProgress
”是易失性的。
2) 尝试在其中扔几个postInvalidate()
或titleProgress.postInvalidate()
以触发重绘。
3) 你有没有在一个类似于巨型绿色机器人的祭坛上牺牲了一台 x486 机器? (开个玩笑)
让我知道前两个(如果你真的很绝望,第三个)是否能帮到你。
【讨论】:
已经尝试了前两个但没有帮助!我很绝望,所以我想这需要3? ;) 3) 选项是所有问题的最佳解决方案……哈哈【参考方案2】:在这种情况下,您应该使用 AsyncTask,请参阅 http://developer.android.com/reference/android/os/AsyncTask.html
如果您的目标不是 1.5 之前的 Android 版本,则必须使用另一个名为 UserTask 的类。 见http://android-developers.blogspot.com/2009/05/painless-threading.html
【讨论】:
【参考方案3】:使用与处理程序的通信,
-
执行你的线程
进入
run()
:您应该向处理程序发送一条消息,该处理程序将更新进度条(当然是水平的):handler.sendMessage(handler.obtainMessage());
在你的 Activity 中,你应该重写 handleMessage(Message msg )
方法:像这样
handler = new Handler()
@override
public void handleMessage(Message msg )
//here you write the code which will update your progressBar
;
【讨论】:
这只有在你的线程被包裹在你的活动类中时才有效。【参考方案4】:你的布局正确吗?您是否尝试过首先使用垂直布局来实现此功能?只是想在您开始活动时查看进度条是否可见?
【讨论】:
【参考方案5】:尝试将 ProgressBar 的样式更改为水平:
style="?android:attr/progressBarStyleHorizontal"
原版
style="?android:attr/progressBarStyleSmall"
提供一个圆形的“进度条”,在标题栏中无法完全看到。
【讨论】:
我什至尝试了应该适合默认标题栏的progressBarStyleSmallTitle。连这个都没有显示。以上是关于Android - 使用 runOnUiThread 从线程进行 UI 更改的主要内容,如果未能解决你的问题,请参考以下文章
想要使用cordova/android禁用android的HardBack按钮
Android 安装包优化Android 中使用 SVG 图片 ( 使用 appcompat 支持库兼容 5.0 以下版本的 Android 系统使用矢量图 )