只有创build视图层次结构的原始线程才能触及其视图。 在Android上

我只是一个初学者,所以请原谅我问一个愚蠢的问题


我不明白的意思只有创build一个视图层次结构的原始线程可以触及其意见。

请有人教我为什么这个错误正在发生,以及如何解决这个问题。

谢谢

这是我的class

public class MainActivity extends Activity { TextView title; Random random = new Random(); int counter = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.startup); startingUp(); } private void startingUp() { Thread timer = new Thread() { //new thread public void run() { Boolean b = true; try { do { counter++; title(); sleep(1000); title.clearComposingText(); } while (b == true); } catch (IntruptedException e) { e.printStackTrace(); } finally { } }; }; timer.start(); } public void title() { title = (TextView) findViewById(R.id.tvTitle); switch (random.nextInt(2)) { case 0: title.setGravity(Gravity.RIGHT); break; case 1: title.setGravity(Gravity.CENTER); break; case 2: title.setGravity(Gravity.LEFT); break; } title.setTextColor(Color.rgb(random.nextInt(250), random.nextInt(250), random.nextInt(250))); title.setTextSize(random.nextInt(55) + 10); } } 

这是我的LogCat

 02-20 10:53:19.293: I/Adreno200-EGLSUB(5816): <ConfigWindowMatch:2078>: Format RGBA_8888. 02-20 10:53:19.303: D/memalloc(5816): /dev/pmem: Mapped buffer base:0x5c914000 size:14135296 offset:10366976 fd:64 02-20 10:53:19.303: E/(5816): Can't open file for reading 02-20 10:53:19.303: E/(5816): Can't open file for reading 02-20 10:53:19.303: D/OpenGLRenderer(5816): Enabling debug mode 0 02-20 10:53:19.373: D/memalloc(5816): /dev/pmem: Mapped buffer base:0x5db58000 size:3768320 offset:0 fd:67 02-20 10:53:20.143: W/dalvikvm(5816): threadid=11: thread exiting with uncaught exception (group=0x40abc210) 02-20 10:53:20.143: E/AndroidRuntime(5816): FATAL EXCEPTION: Thread-3102 02-20 10:53:20.143: E/AndroidRuntime(5816): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 02-20 10:53:20.143: E/AndroidRuntime(5816): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039) 02-20 10:53:20.143: E/AndroidRuntime(5816): at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:722) 02-20 10:53:20.143: E/AndroidRuntime(5816): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:771) 02-20 10:53:20.143: E/AndroidRuntime(5816): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4112) 02-20 10:53:20.143: E/AndroidRuntime(5816): at android.view.View.invalidate(View.java:8639) 02-20 10:53:20.143: E/AndroidRuntime(5816): at android.view.View.invalidate(View.java:8590) 02-20 10:53:20.143: E/AndroidRuntime(5816): at android.widget.TextView.setGravity(TextView.java:2538) 02-20 10:53:20.143: E/AndroidRuntime(5816): at com.example.saikoro.MainActivity.title(MainActivity.java:58) 02-20 10:53:20.143: E/AndroidRuntime(5816): at com.example.saikoro.MainActivity$1.run(MainActivity.java:36) 

Related of "只有创build视图层次结构的原始线程才能触及其视图。 在Android上"

把你的startingUp()改成这个。

  private void startingUp() { Thread timer = new Thread() { //new thread public void run() { Boolean b = true; try { do { counter++; title(); sleep(1000); runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub title.clearComposingText(); } }); } while (b == true); } catch (IntruptedException e) { e.printStackTrace(); } finally { } }; }; timer.start(); } 

您不能修改非UI线程的视图。

这个exception不是由于title.clearComposingText()引起的。 即使这一行没有用,我们可以删除这一行。 这个exception进入到title()函数中,因为非UI线程试图修改视图。 所以我们需要在UI Thread或Handler中调用这个函数

 private void startingUp() { Thread timer = new Thread() { //new thread public void run() { boolean b = true; try { do { counter++; sleep(1000); runOnUiThread(new Runnable() { @Override public void run() { title(); //title.clearComposingText();//not useful } }); } while (b == true); } catch (InterruptedException e) { e.printStackTrace(); } finally { } }; }; timer.start(); } 

你不能用title.clearComposingText();修改文本title.clearComposingText(); 在线程内部,因为你只能从UI线程修改视图。 使用处理程序,让他改变文字。

你不应该从线程以外的UI线程更新textView。你可以使用asynctask 这个。可以参考这个

正如其他人已经指出,你不能从后台线程修改UI。

您可以使用AsyncTask ,也可以使用Activity.runOnUiThread()方法