Android setText错误:";只有原始线程。。可以触及它的观点”;

Android setText错误:";只有原始线程。。可以触及它的观点”;,android,Android,当我想将文本设置为文本视图时,应用程序强制关闭并给出以下错误: android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图 这是我代码的一部分: Thread ThreadRecording = new Thread(new Runnable() { public void run() { while(recorder) { if (

当我想将文本设置为文本视图时,应用程序强制关闭并给出以下错误:

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

这是我代码的一部分:

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\u num=body\u num+1
,线程将检查body\u num==10

您只能在UI线程中修改视图,您需要使用处理程序,例如

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();

您只能在UI线程中修改视图,您需要使用处理程序,例如

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();
只有创建视图层次结构的原始线程才能接触其视图

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

处理程序有两种主要用途:

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

    背景螺纹:

    new Thread() {
    
    public void run() {
        while(recorder)
            {
                if (body_num = 10)
                {                
                    messageHandler.sendEmptyMessage(0);
                }
            }
       }
    
    }.start();
    
    放置在主线程中的处理程序:

    private Handler messageHandler = new Handler() {
    
    public void handleMessage(Message msg) {
                 //update your view here
       }
    };
    
    只有创建视图层次结构的原始线程才能接触其视图

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

    处理程序有两种主要用途:

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

    背景螺纹:

    new Thread() {
    
    public void run() {
        while(recorder)
            {
                if (body_num = 10)
                {                
                    messageHandler.sendEmptyMessage(0);
                }
            }
       }
    
    }.start();
    
    放置在主线程中的处理程序:

    private Handler messageHandler = new Handler() {
    
    public void handleMessage(Message msg) {
                 //update your view here
       }
    };
    

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

    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 );
    }
    }
    

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

    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 );
    }
    }
    

    请参阅此处(如果仅搜索错误消息,可能会找到重复的/解决方案。请以后再试)。注意:1-
    ThreadRecording
    是类
    Thread
    的实例,因此其名称应以小写字母IE
    ThreadRecording
    开头。2-您可以跳过声明
    线程
    ,而只需要
    新线程(newrubbable(){/*contents…*/})请参阅此处(如果仅搜索错误消息,可能会找到重复的/解决方案。请以后再试)。注意:1-
    ThreadRecording
    是类
    Thread
    的一个实例,因此其名称应以小写字母IE
    ThreadRecording
    开头。2-您可以跳过声明
    线程
    ,而只需要
    新线程(newrubbable(){/*contents…*/})这就是我想要的,谢谢!!这就是我想要的,谢谢!!这就是我想要的,谢谢!!这就是我想要的,谢谢!!