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 更改的主要内容,如果未能解决你的问题,请参考以下文章

Android之SharedPreferences使用

想要使用cordova/android禁用android的HardBack按钮

如何在Mac中使用Android SDK

何时使用“?android”或“@android”?

Android 安装包优化Android 中使用 SVG 图片 ( 使用 appcompat 支持库兼容 5.0 以下版本的 Android 系统使用矢量图 )

Android Handler使用