1.首先我们通过一个实例案例来引出一个异常:
(1)布局文件activity_main.xml:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 tools:context=".MainActivity" > 6 7 <TextView 8 android:id="@+id/tv" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:layout_centerHorizontal="true" 12 android:layout_centerVertical="true" 13 android:text="@string/hello_world" /> 14 15 </RelativeLayout>
(2)MainActivity.java:
package com.itheima.testthread; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println(Thread.currentThread().getName()); final TextView tv = (TextView) findViewById(R.id.tv); new Thread() { public void run() { for (int i = 0; i < 100; i++) { tv.setText("哈哈哈"+i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); } }
(3)布署程序到模拟器上,出现如下效果,程序直接stop;并且直接报出异常错误:
报错:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
意思:从错误线程调用的异常。谁创建的view,谁才能修改编辑view,只有主线程才可以修改view(所有的View都是主线程创建的)。
总结:上面报这个CalledFromWrongThreadException错误,是因为只有主线程才能修改View更新UI,但是我们这里却自己新建一个线程new Thread()其中run()的内容涉及到更新UI,这是不允许的,所有才会出现这样的错误警告。
但是往往我们编写程序的时候设计多个线程需要控制UI显示,但是我们上面已经说过了UI更新只能交给主线程,为了解决这个矛盾,解放程序员,google开发出来消息机制,用来子线程和主线程通信,子线程要更新UI,就会发送消息数据给主线程,这样主线程就会更新相应的UI界面,从而解决这个矛盾。
时间: 2024-11-11 09:42:30