只有创建视图层次结构的原始线程才能接触其视图。在安卓上[重复]
Posted
技术标签:
【中文标题】只有创建视图层次结构的原始线程才能接触其视图。在安卓上[重复]【英文标题】:Only the original thread that created a view hierarchy can touch its views. On android [duplicate] 【发布时间】:2013-02-05 08:21:13 【问题描述】:我只是一个初学者,所以请原谅我问了一个愚蠢的问题
我不明白只有创建视图层次结构的原始线程才能触摸其视图的含义。
请有人教我为什么会出现这个错误以及如何解决这个问题。
谢谢你
这是我的课
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)
【问题讨论】:
我觉得这里需要学习一下UI线程的概念。 developer.android.com/guide/components/… 谢谢,但是你知道我需要做什么来解决这个问题吗? 对不起,我昨天才开始使用***,所以我真的不知道发生了什么 谢谢大家帮助我!!! 【参考方案1】:将您的 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 线程修改视图。
【讨论】:
【参考方案2】:由于 title.clearComposingText() 不会出现此异常。 即使这条线没有用,我们可以删除这条线。 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();
【讨论】:
【参考方案3】:您不能在线程内修改带有title.clearComposingText();
的文本,因为您只能从 UI 线程修改视图。改用处理程序,让他更改文本。
【讨论】:
【参考方案4】:您不应该从 UI 线程以外的线程更新 textView。您可以为此使用 asynctask。可以参考this
【讨论】:
【参考方案5】:正如其他人已经说过的,您不能从后台线程修改 UI。
您可以使用AsyncTask
,也可以使用Activity.runOnUiThread()
方法
【讨论】:
以上是关于只有创建视图层次结构的原始线程才能接触其视图。在安卓上[重复]的主要内容,如果未能解决你的问题,请参考以下文章
致命例外:JavaBridge - 只有创建视图层次结构的原始线程才能接触其视图
Android “只有创建视图层次结构的原始线程才能接触其视图。” for循环中的错误[重复]
Android错误:只有创建视图层次结构的原始线程才能触摸其视图[重复]