当我想setText到textView时,应用程序强制关闭并给出以下错误:
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_num + 1,线程检查body_num == 10
发布于 2012-12-27 01:01:22
只有创建视图层次结构的原始线程才能触摸其视图。
因为只有在UI (主)线程中,您才能操纵视图。您可以使用Hanlder更新视图。
Handler有两个主要用途:
示例:
背景线程:
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
}
};发布于 2012-12-27 00:57:34
只能修改UI线程中的视图,需要使用Handler,例如,
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();发布于 2020-05-16 16:07:30
这也可以通过使用AsyncTask来实现。下面是在R.string.your_text中设置字符串资源(TextView)的示例代码:
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视图:
new CommonSetText ( textView, R.string.your_text ).execute ( );https://stackoverflow.com/questions/14048080
复制相似问题