Adroid Studio 上 说:“Method getText() must be called from UI thread.

敲代码的小哥 2016-01-15 05:19:58

要怎么改呀!

package com.luo.socket;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class MainActivity extends ActionBarActivity {

EditText ip;
EditText editText;
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);



ip = (EditText) findViewById(R.id.ip);
editText = (EditText) findViewById(R.id.edit);
text = (TextView)findViewById(R.id.text);

findViewById(R.id.connect).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
connect();
}
});

findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
send();
}
});
}


//---------------------------------------------------------------------


Socket socket = null;
BufferedWriter writer = null;
BufferedReader reader = null;

public void connect() {
AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() {
private String[] values;

@Override
protected Void doInBackground(Void... arg0) {
try {
socket = new Socket(ip.getText().toString(), 12345); //!!!!这里的ip.getTex().toString()出了问题
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
publishProgress("@success");
} catch (IOException e) {
Toast.makeText(MainActivity.this, "Build fail!", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}

try {
String line = null;
while ((line = reader.readLine()) != null) {
publishProgress(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onProgressUpdate(String... values) {
if(values[0].equals("@success")) {
Toast.makeText(MainActivity.this, "Build success!", Toast.LENGTH_SHORT).show();
}
text.append("Othes say:"+values[0]+"\n");
super.onProgressUpdate(values);
}
};
read.execute();
}

public void send() {
try {
text.append(("I say :" + editText.getText().toString() +"\n"));
writer.write(editText.getText().toString() + "\n");
writer.flush();
editText.setText(" ");
} catch (IOException e) {
e.printStackTrace();
}

}

}
...全文
645 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mao939101699 2016-09-29
  • 打赏
  • 举报
回复
您好,请问楼主的问题解决了吗?我也遇到这种问题
  • 打赏
  • 举报
回复
建议这个ip通过可变参数传入
东山少爷猪头 2016-01-18
  • 打赏
  • 举报
回复
在read.execute();之前保存这个getText()的值,然后socket = new Socket里面放这个值就行了. 例如: public void connect() { String text=ip.getText().toString(); //加这一行 AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() { . . . . socket = new Socket(text, 12345); //改这一行 就这么简单
网络咖啡 2016-01-18
  • 打赏
  • 举报
回复
使用Handler处理界面的逻辑代码
索吻的贼 2016-01-18
  • 打赏
  • 举报
回复
AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() 没记错的话修改这里,能够做到在 protected Void doInBackground(Void... arg0) {方法中传递参数的 你试试改成 new AsyncTask<Void, String,String>试试。
qq_27665781 2016-01-17
  • 打赏
  • 举报
回复
activity.runontuchevent(new runable) 回到主线程再更新数据 字可能有打错,
敲代码的小哥 2016-01-17
  • 打赏
  • 举报
回复
改了可是就运行异常退出了
罗博士 2016-01-16
  • 打赏
  • 举报
回复
支持2楼,其实AS说的很清楚。
静默加载 应用层 2016-01-15
  • 打赏
  • 举报
回复
“Method getText() must be called from UI thread”告诉你不能再非主线程中执行getText()方法,那么将它放在主线程中。2楼说的就行,执行AsyncTask的时候你只需要一个字符串。
ganshenml 2016-01-15
  • 打赏
  • 举报
回复
在MainActivity中定义变量str,并在Oncreate方法中实例化该对象(str=ip.getText().toString()),用该str对象替换之前你报错的地方试试

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧