`

UI线程阻塞导致主界面无法刷新

 
阅读更多

错误如下:

06-15 04:33:34.789: W/dalvikvm(2924): threadid=14: thread exiting with uncaught exception (group=0x40a791f8)
06-15 04:33:34.789: E/AndroidRuntime(2924): FATAL EXCEPTION: ComposeHandler
06-15 04:33:34.789: E/AndroidRuntime(2924): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4109)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:709)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.setFlags(View.java:6728)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.view.View.setVisibility(View.java:4625)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at com.android.mms.ui.ComposeMessageActivity.updateTypingIcon(ComposeMessageActivity.java:8182)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at com.android.mms.ui.ComposeMessageActivity.access$9700(ComposeMessageActivity.java:257)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at com.android.mms.ui.ComposeMessageActivity$ComposeEventHdlr.handleMessage(ComposeMessageActivity.java:8619)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.os.Looper.loop(Looper.java:137)
06-15 04:33:34.789: E/AndroidRuntime(2924):     at android.os.HandlerThread.run(HandlerThread.java:60)
06-15 04:33:34.820: W/ActivityManager(224):   Force finishing activity com.android.mms/.ui.ComposeMessageActivity

 

 

修改方法:

将更新UI代码加入到activity的UI线程队列中

    /*<Hap5.2 Message+ kf55773 2012-06-15 begin */
    private void updateTypingIcon(final boolean aEnableTyping) {
        ComposeMessageActivity.this.runOnUiThread(new Runnable() {
            public void run() {
                if (null == mTypingIcon) {
                    /* modified by Message+ kf36922 20120207 begin */
                    mTypingIcon = (GifView) findViewById(R.id.typing);
                    /* modified by Message+ kf36922 20120207 end */
                }
                if (aEnableTyping) {
                    mTypingIcon.setVisibility(View.VISIBLE);
                } else {
                    mTypingIcon.setVisibility(View.GONE);
                }
            }
        });
    }
   /*<Hap5.2 Message+ kf55773 2012-06-15 end */

 

分享到:
评论

相关推荐

    C# 线程更新UI界面

    特别是在UI(用户界面)开发中,为了保证界面的流畅性,通常我们会将耗时操作放在后台线程进行,而更新UI则需要在主线程(也称为UI线程)中完成。这是因为UI控件不是线程安全的,多个线程并发访问可能导致数据不一致...

    qt编程_在子线程中更新UI界面

    然而,当执行耗时的操作,如网络请求、大数据处理或长时间计算时,如果在主线程中执行,会阻塞UI,导致界面无响应,用户体验下降。为了解决这个问题,我们可以将这些操作放在子线程中执行,然后通过特定机制更新UI。...

    ndroid异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    在Android开发中,UI线程(主线程)主要负责用户界面的绘制与交互,因此它必须保持流畅,避免被耗时操作阻塞。为了解决这个问题,Android提供了多种异步处理机制,其中一种常见的方式是使用`Thread`配合`Handler`来...

    UI 线程 和 工作线程 的实现

    而工作线程则用于执行耗时的任务,如大量计算、网络通信或读写文件,以避免阻塞UI线程,保持用户界面的响应性。 在MFC(Microsoft Foundation Classes)框架中,我们可以利用其提供的多线程支持来实现UI线程和工作...

    C#多线程刷新界面

    在压缩包中的文件“**多线程主界面刷新(guojie)**”很可能是一个示例项目,可能包含了一个或多个人工创建的线程或使用上述组件来演示如何在后台线程处理任务并在UI线程安全更新界面的方法。 总之,C#多线程刷新...

    QT多线程—主界面卡死解决方案

    工作线程则是执行非UI相关任务的地方,它们不会阻塞主线程,因此不会影响用户与界面的交互。 创建一个工作线程通常涉及以下步骤: 1. 继承QThread类并重写run()方法:在这个方法中,我们将放置执行耗时任务的代码...

    VBnet 分线程窗体,主线程卡死任然报告方法的进度值到UI窗体上面

    在VB.NET编程中,我们经常会遇到需要执行耗时任务的情况,这些任务可能会导致应用程序的主线程(UI线程)被阻塞,进而使用户界面变得无响应。标题和描述所提及的问题是关于如何在分线程中执行任务,并在主线程卡死时...

    qt 多线程 防止主线程做循环操作导致界面假死

    为了解决这个问题,我们可以利用Qt提供的多线程机制,将耗时操作转移到子线程执行,以确保主线程能够保持对UI的及时更新。以下将详细讲解如何在Qt中使用多线程防止界面假死,并给出一种有效的方法。 1. Qt中的线程...

    InvokeHelper跨线程操作主界面控件

    总的来说,"InvokeHelper跨线程操作主界面控件"是C#多线程编程中的一个重要实践,它通过封装Invoke或BeginInvoke方法,解决了非UI线程更新UI的问题,提高了代码的可读性和易用性。在实际项目中,合理使用...

    DELPHI7 线程自动刷新

    "DELPHI7 线程自动刷新"这个主题涉及到的是如何在Delphi 7中使用线程来实现数据或界面的自动更新,以提高程序的响应性和用户体验。 在Delphi 7中,创建线程通常是通过继承自TThread类来完成的。TThread是VCL...

    QT子线程更新主线程

    "QT子线程更新主线程"这个主题涉及到如何在后台线程(子线程)执行耗时操作,并将结果安全地传递到用户界面线程(主线程),以避免阻塞UI,保持其流畅性。 Qt库提供了QThread类来支持多线程编程。子线程通常用于...

    MFC-UI.rar_MFC_MFC界面_mfcui设_mfcui阻塞_漂亮的mfc界面

    3. **MFCUI阻塞**:在MFC编程中,阻塞通常是指应用程序的主消息循环被长时间运行的任务阻塞,导致用户界面无法响应。为避免阻塞,可以使用多线程技术,或者将耗时操作放在后台线程执行。同时,可以利用UpdateData或...

    Android环境下主UI线程与子线程通信机制研究.pdf

    在上述示例中,如果需要从网络下载图片并且该操作放在onCreate方法的主线程中,那么这段代码在下载图片期间会阻塞UI线程,导致应用程序无法响应用户操作,造成界面假死状态。 ### 知识点四:子线程的使用场景 子...

    C#用了多线程界面卡死

    当UI线程调用的API可能会导致阻塞时间超过30毫秒时(例如访问CD-ROM等较慢的外部设备或进行远程调用等),应考虑使用多线程。30毫秒这个阈值是因为人眼可以感知到的最小延迟约为30毫秒,如果超过这个时间,用户就会...

    界面线程创建

    在多线程应用中,非UI线程通常用于执行计算密集型任务,以避免阻塞用户界面。为了在非UI线程中与界面交互,我们需要使用各种同步机制,如`PostMessage`,`PostThreadMessage`,`Invoke`(对于COM对象),或者使用C++...

    解决PySide+Python子线程更新UI线程的问题

    2. **防止UI线程阻塞**:在子线程中执行耗时操作时,要确保不会阻塞UI线程,否则会导致界面卡顿。 3. **资源管理**:在多线程环境下,需要注意资源的管理和释放,避免内存泄漏等问题。 通过上述方法,我们可以有效...

    细说UI线程和Windows消息队列.doc

    开发者必须确保UI线程不被长时间阻塞,以免影响用户界面的更新和响应。此外,合理利用消息机制可以实现异步操作,提高程序的并发性能。 总的来说,UI线程是应用程序与用户交互的中心,它通过消息队列与操作系统进行...

    C#的多线程示例;几个多线程之间的互斥,同步;WPF主界面INVOKE

    本文将深入探讨C#中的多线程机制,包括线程互斥与同步,以及如何在WPF主界面中安全地更新UI。 首先,让我们理解什么是多线程。多线程是指一个应用程序内同时运行多个独立的执行线程。在C#中,可以使用`System....

    c#使用进度条加载主界面

    在C#编程中,"使用进度条加载主界面"是一个常见的用户界面(UI)优化技巧,主要用于提升用户体验,让用户能够直观地看到程序的运行状态。本文将深入探讨如何利用进度条来显示主界面的加载过程,同时涉及委托和线程的...

    c# winform异步不卡界面的实现方法

    界面卡死的原因是因为耗时任务的计算占用了主线程,导致主界面没有办法进行其它操作。这篇文章将为您介绍如何使用异步编程来避免界面卡死的方法。 首先,需要了解的是,界面卡死的原因是因为耗时任务的计算占用了...

Global site tag (gtag.js) - Google Analytics