我不明白为什么setText
不对TextView
做任何事情,而且我似乎根本没有收到任何错误。
我尝试设置文本的一个原因是,我想看看是否成功地与服务器建立了连接。
下面是我的代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText textField = findViewById(R.id.textField);
final Button submitBtn = findViewById(R.id.submitBtn);
final TextView debugLbl = findViewById(R.id.debugLbl);
final TextView debug2Lbl = findViewById(R.id.debug2);
submitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String text = textField.getText().toString();
textField.setText("");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
try {
Socket socket = new Socket("10.0.2.2", 9723);
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write(text);
bw.flush();
debug2Lbl.setText("Successfully sent message : "+ text + " to server");
socket.close();
} catch (Exception e) {
e.printStackTrace();
debugLbl.setText("error");
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
});
}
}
发布于 2018-06-04 02:39:27
正如@waqaslam所说的,你不能使用非UI线程来设置UI项,比如AsyncTask或其他线程。
下面是如何在AsyncTask
中使用setText
的一小段代码。
runOnUiThread(new Runnable() {
@Override
public void run() {
debug2Lbl.setText("Successfully sent message : "+ text + " to server");
}
});
发布于 2018-06-04 02:41:26
这是因为你没有在ui设置文本thread.it意味着你启动的线程不能执行一些ui命令,如setText,notifyDataSetChanged...
有几种解决方案:
1-复制此代码而不是您的debug2Lbl.setText("Successfully message:"+ text +“to server");
Handler mhandler=new Handler(Looper.getMainLooper);
mhandler.post(new Runnable() {
@Override
public void run() {
debug2Lbl.setText("Successfully sent message : "+ text + " to server");
}
});
2-在uiThread.it上运行你的setText。推荐:
YourActivityName.this.runOnUiThread(new Runnable() {
@Override
public void run() {
debug2Lbl.setText("Successfully sent message : "+ text + " to server");
}
});
并在catch状态下为setText执行此操作。注意:我也提供给你阅读同步的类。
不要忘了检查为工作答案;)
发布于 2018-06-04 04:54:19
执行以下操作:
runOnUiThread(new Runnable() {
@Override
public void run() {
debug2Lbl.setText("yourtext");
}
});
https://stackoverflow.com/questions/50668810
复制相似问题