public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } ((TextView)findViewById(R.id.textView)).setText("子线程中操作view"); } }).start(); } }
运行之后就能看到熟悉的崩溃日志了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
02-28 22:36:48.550 3780 3817 E AndroidRuntime: FATAL EXCEPTION: Thread-5 02-28 22:36:48.550 3780 3817 E AndroidRuntime: Process: com.example.linjw.myapplication, PID: 3780 02-28 22:36:48.550 3780 3817 E AndroidRuntime: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6987) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1104) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.view.View.requestLayout(View.java:19807) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.view.View.requestLayout(View.java:19807) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.view.View.requestLayout(View.java:19807) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.view.View.requestLayout(View.java:19807) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.support.constraint.ConstraintLayout.requestLayout(ConstraintLayout.java:874) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.view.View.requestLayout(View.java:19807) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.widget.TextView.checkForRelayout(TextView.java:7375) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.widget.TextView.setText(TextView.java:4487) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.widget.TextView.setText(TextView.java:4344) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at android.widget.TextView.setText(TextView.java:4319) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at com.example.linjw.myapplication.MainActivity$1.run(MainActivity.java:20) 02-28 22:36:48.550 3780 3817 E AndroidRuntime: at java.lang.Thread.run(Thread.java:760)
void checkThread() { if (mThread != Thread.currentThread()) { throw new CalledFromWrongThreadException( "Only the original thread that created a view hierarchy can touch its views."); } }
public void requestLayout() { if (!mHandlingLayoutInLayoutRequest) { checkThread(); mLayoutRequested = true; scheduleTraversals(); } }