Android-android 给textview设置文本崩溃了

Android-android 给textview设置文本崩溃了

虐人心 发布于 2017-09-09 字数 341 浏览 1248 回复 6

随便写了一段代码,在线程里面给textview设置文本,有时居然会导致程序崩溃,怎么回事?代码:

public TextView pc;

oncreate(..) {
setContentView(R.layout.main);
pc = new TextView(context);
Thread t =new Thread() {
public void run() {
pc.setText("test");
}};
t.start();

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

浮生未歇 2017-11-02 6 楼

错误信息大概的意思就是只有创建它(你代码中的 pc )的线程,才能去观摩其节点相关信息。 翻译的可能不是很好。
不过保持着只有主线程能修改UI的这个点,你这么写肯定是不行的, 你pc.setText("test");界面肯定要刷新吖, 你是在子线程里面去刷新的,肯定不行。
给来一个handler. 通过主线程的looper 构建一个handler ,以消息队列的方式,把需要更新的消息传递给主线程吧。
这是其中的一种。

public TextView pc;
public Handler handler = new Handler(){};
oncreate(..) {
  setContentView(R.layout.main);
  pc = new TextView(context);
  Thread t =new Thread() {
    public void run() {
      handler.post(new Runnabler(){
        public void run(){
          pc.setText("test");
        }
      }); 
    }
  };
}
t.start();
夜无邪 2017-10-29 5 楼

这个不能这么写吧。子线程里面不能操作UI的,可以试试runOnUIThread()方法,或者使用Handler

清晨说ぺ晚安 2017-10-28 4 楼

的确,很多 sdk 都是这么规定的,不允许在其他线程里面进行界面的修改。
就 Android 而言,推荐使用 handler 来处理其他线程与界面主线程的数据通信和界面变动。

在 Activity 中添加一个 Handler 变量,然后赋值为一个 new Handler(){};
在 Handler 内部重载 handleMessage 方法;
根据 handleMessage 的 msg 参数,来区分来自不同线程或者进程的消息。

在其他线程中完成所需要的操作之后,将必要的信息存入 Message 类型的变量中,然后发送给界面的Handler,在 Handler 的 handleMessage 方法中分类处理即可。

附上官方的 Handler 参考手册

祝好,
斑驳敬上

甜柠檬 2017-10-28 3 楼

这个问题是显而易见的啊!android的UI操作不是线程安全的,所以不能在非UI线程即不是主线程的线程中进行UI操作!

 Thread t =new Thread() {
public void run() {
//更新了TextView
pc.setText("test");
}};

你这段代码就是在非UI线程中进行UI操作,所以就产生了错误!

虐人心 2017-09-28 2 楼

这是线程安全问题,子线程不得做UI操作

欢迎品读
http://www.cnblogs.com/over140/archive/2011/09/12/2173951.html

想挽留 2017-09-14 1 楼

2.x以上版本提供了另一种方式
activity中调用runOnUiThread(Runnable runnable)方式
这也是可以更新View的,但是不太建议使用,还是使用handler较为正统