当前位置: 首页 > 知识库问答 >
问题:

setText错误:“只有原始线程...可以触摸它的视图”

郜昊苍
2023-03-14

当我想将Text设置为text View时,应用程序力关闭并给我这个错误:

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

这是我的代码的一部分:

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_num1,线程会检查body_num==10

共有3个答案

长孙朝明
2023-03-14

这也可以通过使用AsyncTask来实现。下面是在TextView中设置字符串资源(R.string.your\u 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 );
}
}

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

new CommonSetText ( textView, R.string.your_text ).execute (  );
夏烨霖
2023-03-14

您只能在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();
陈修诚
2023-03-14

只有创建视图层次结构的原始线程可以触摸其视图

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

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

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

例子:

背景Thread:

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
   }
};
 类似资料: