`
dawuafang
  • 浏览: 1191855 次
文章分类
社区版块
存档分类
最新评论

子线程修改UI异常

 
阅读更多

异常信息:

01-10 00:46:22.039: E/AndroidRuntime(1621): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

点击事件中修改一个TextView的颜色:

public void changeColor (View v){
    new Thread(new Runnable() {

        @Override
        public void run() {
             //子线程更新UI

            main_tv.setTextColor(Color.RED);
        }
    }).start();
}

子线程是无法直接修改UI的我们可以子线程里通过handler.setMessage(),来通知UI线程(主线程) 修改UI

public void changeColor (View v){
final Thread thread  =new Thread(new Runnable() {

        @Override
        public void run() {

            //子线程更新UI
//          
//          if(Looper.myLooper()==Looper.getMainLooper()){
//          main_tv.setTextColor(Color.RED);
//          }

             Message msg =Message.obtain();
             msg.what=1;
            Handler.sendMessage(msg ); //发消息
        }
    });
    thread.start();

}

接收处理消息:

public class MainActivity extends Activity {

    private String TAG ="MainActivity";

    Handler Handler = new Handler(){

        public void handleMessage(android.os.Message msg) {

            if(msg.what==1){

                main_tv.setTextColor(Color.RED);
            }

        };
    };
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    C#子线程更新UI控件的方法实例总结

    这使得我们可以安全地修改UI控件的属性。 下面是一个使用Invoke方法的示例: ```csharp private void button6_Click(object sender, EventArgs e) { Thread demoThread = new Thread(new ThreadStart...

    c#子线程操作UI控件的简单委托 包含带参数和不带参数源码

    因此,当一个子线程试图修改UI控件时,会抛出“Cross-thread operation not valid”的异常。为了解决这个问题,我们需要使用特定的方法,如`Control.Invoke`或`Control.BeginInvoke`,它们允许子线程安全地调用主线...

    C#-WinForm跨线程修改UI界面的实例

    当需要在后台线程或者新线程中执行耗时操作时,直接修改UI组件可能会导致“Cross-thread operation not valid”的异常,因为这违反了UI线程的同步规则。为了解决这个问题,开发者通常会使用异步编程技术,如`...

    WPF 使用线程更新UI

    5. **数据绑定的线程安全**:WPF的数据绑定机制默认是线程安全的,但如果直接在后台线程修改绑定源,可能会引发异常。正确做法是先在后台线程更新数据源,然后通过Dispatcher更新UI。 6. **UI元素的...

    sub-thread-access-to-the-main-thread.rar_c# 子线程_sub

    3. **Invoke/BeginInvoke方法**:当子线程需要修改UI元素时,必须使用控件的`Invoke`或`BeginInvoke`方法。这是因为这些方法会确保在正确的线程(即UI线程)上执行操作。`Invoke`是同步的,它会等待操作完成;`...

    安卓UI线程机制 ,在子线程中访问UI

    1. 不允许直接操作:默认情况下,Android不允许在非UI线程中直接修改UI组件,因为这可能导致UI不一致和应用崩溃。Android的UiThread StrictMode策略会检测到这种行为并抛出异常。 2. 使用Handler:为了在子线程中...

    Android子线程与更新UI问题的深入讲解

    而在`情形二`中,由于添加了5秒的睡眠时间,子线程尝试更新UI时,主线程已经被阻塞,此时尝试修改UI就会抛出异常。这是因为Android的UI更新机制要求所有对UI的操作必须在创建该UI的线程(主线程)中执行。 **解决...

    C# 线程更新UI界面

    - 界面更新限制:非UI线程不能直接修改UI元素,否则会抛出`CrossThreadException`异常。 3. **C#中的委托** - 委托是一种类型,代表一个方法的引用。它们在多线程编程中用于传递方法调用,实现异步操作。 - 委托...

    Android主线程和子线程区别详解

    2. 子线程中无法直接修改UI组件,因为Android系统不允许非主线程对UI进行操作。 3. 如果需要在子线程中更新UI,必须通过Handler、runOnUiThread或使用Android提供的AsyncTask等机制,将任务回调到主线程执行。 在...

    MulThread.rar_多线程 进度条_子线程界面_进度条 多线程

    "MulThread.rar_多线程 进度条_子线程界面_进度条 多线程"这个压缩包文件提供了关于如何在实际项目中实现多线程与进度条功能的实例。下面将详细探讨相关知识点: 1. **多线程**:多线程是操作系统并发执行多个线程...

    android中UI主线程与子线程深入分析

    因此,Android系统规定,只有主线程才能修改UI组件,否则会抛出`CalledFromWrongThreadException`异常。 为了解决这个问题,开发者通常会在后台创建子线程进行耗时操作,然后通过消息传递机制与主线程通信。这里最...

    android使用handler ui线程和子线程通讯更新ui示例

    在Android应用开发中,UI(用户界面)更新必须在主线...这种机制避免了直接在非UI线程中修改UI组件导致的`Android.view.ViewRootImpl$CalledFromWrongThreadException`异常,确保了应用的稳定性和用户界面的正确更新。

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

    如果尝试在非UI线程中直接修改UI组件,将会触发`CalledFromWrongThreadException`异常。 为了提高用户体验并避免UI卡顿,开发者通常会在后台线程执行耗时的操作(如复杂的计算、I/O读写等),并将结果通过某种方式...

    Android实现在子线程中更新Activity中UI的方法

    此外,如果你需要在子线程中捕获并处理异常,可以将异常对象放在Message的`obj`字段中,然后在主线程中通过`Toast`或`AlertDialog`展示给用户。这样,子线程的错误信息就能被用户看到了。 总之,Android的Handler...

    Android开发中多线程与UI更新.docx

    这是因为UI组件只能在主线程中安全地访问和修改。当子线程完成某个任务并需要更新UI时,可以通过以下几种方式通知主线程: 1. **Handler机制**:通过定义一个`Handler`对象并在子线程中发送消息给该`Handler`,可以...

    17.Handler消息传递机制

    但这里有一个问题,Android不允许在非主线程中直接修改UI,因此这段代码会抛出`android.os.NetworkOnMainThreadException`异常,导致程序崩溃。 正确的做法是使用Handler来处理子线程与主线程的通信。Handler通常...

    多线程 dataGridView问题

    如果你在一个后台线程中直接修改`dataGridView`的内容,如添加、删除或修改单元格,系统会抛出`CrossThreadOperationException`异常,提示线程不安全。 解决这个问题的方法之一是使用`Control.Invoke`或`Control....

    Android通过Http获取JSON并进行UI更新

    由于不能直接在非主线程中修改UI,我们需要借助Handler。在主线程中创建一个Handler对象,并重写`handleMessage`方法: ```java Handler mainHandler = new Handler(Looper.getMainLooper()) { @Override public...

Global site tag (gtag.js) - Google Analytics