首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >setText错误:“只有原始线程.才能触摸其视图”

setText错误:“只有原始线程.才能触摸其视图”
EN

Stack Overflow用户
提问于 2012-12-27 00:47:32
回答 3查看 2.1K关注 0票数 1

当我想setText到textView时,应用程序强制关闭并给出以下错误:

android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触摸其视图。

这是我代码的一部分:

代码语言:javascript
运行
复制
Thread ThreadRecording = new Thread(new Runnable() {
    public void run() {
        while(recorder)
        {
            if (body_num = 10)
            {
                TextView loog = (TextView)findViewById(R.id.textView1);
                loog.setText("Total : 10, Thank you");
            }
        }
    }
});
ThreadRecording.start();

有一个按钮;如果用户单击它,它会调用一个函数来设置body_num = body_num + 1,线程检查body_num == 10

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-27 01:01:22

只有创建视图层次结构的原始线程才能触摸其视图。

因为只有在UI (主)线程中,您才能操纵视图。您可以使用Hanlder更新视图。

Handler有两个主要用途:

  1. 将消息和运行表安排为将来某个时间点执行;以及
  2. 将要在与您自己的线程不同的线程上执行的操作排队。当为应用程序创建进程时,其主线程专用于运行消息队列,负责管理顶级应用程序对象(活动、广播接收器等)及其创建的任何窗口。您可以创建自己的线程,并通过Handler与主应用程序线程进行通信。这是通过调用与前面相同的post或sendMessage方法来完成的,但是是从新线程调用的。然后,给定的可运行或消息将在Handler的消息队列中进行调度,并在适当时进行处理。“ --来自"developer.android.com“

示例:

背景线程:

代码语言:javascript
运行
复制
new Thread() {

public void run() {
    while(recorder)
        {
            if (body_num = 10)
            {                
                messageHandler.sendEmptyMessage(0);
            }
        }
   }

}.start();

您的处理程序放在主线程中:

代码语言:javascript
运行
复制
private Handler messageHandler = new Handler() {

public void handleMessage(Message msg) {
             //update your view here
   }
};
票数 3
EN

Stack Overflow用户

发布于 2012-12-27 00:57:34

只能修改UI线程中的视图,需要使用Handler,例如,

代码语言:javascript
运行
复制
Handler h = new Handler(context.getMainLooper()) {
    public void handleMessage(Message msg) {
        TextView loog = (TextView)findViewById(R.id.textView1);
        loog.setText(msg.obj);
    }
};

Thread ThreadRecording = new Thread(new Runnable() {
    public void run() {
        while(recorder)
        {
            if (body_num = 10)
            {
                Message message = new Message();
                message.obj = "Total : 10, Thank you";
                handler.sendMessage(message);
            }
        }
    }
});
ThreadRecording.start();
票数 1
EN

Stack Overflow用户

发布于 2020-05-16 16:07:30

这也可以通过使用AsyncTask来实现。下面是在R.string.your_text中设置字符串资源(TextView)的示例代码:

代码语言:javascript
运行
复制
public class CommonSetText extends AsyncTask<Void, Void, Integer> {
private WeakReference<TextView> textView;
private int stringID;

public CommonSetText ( TextView textView, Integer stringID) {
    this.textView = new WeakReference<>(textView);
    this.stringID = stringID;
}

@Override
protected Integer doInBackground ( Void... voids ) {
    return stringID;
}

@Override
protected void onPostExecute ( Integer stringID ) {
    super.onPostExecute ( stringID );
    textView.get ().setText ( stringID );
}
}

然后使用以下代码将文本设置为text视图:

代码语言:javascript
运行
复制
new CommonSetText ( textView, R.string.your_text ).execute (  );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14048080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档