我一整天都在努力制作 Android 客户端应用程序。我设法从服务器获得答案,但无法在 TextView 中正确显示它。我使用这里的其他答案或 YouTube 视频制作了该应用程序。
应用程序应该非常简单。然后我按下一个按钮,它会向服务器发送 SQL 查询,并从数据库返回一些数据,这些数据应显示在 TextView 中。
我将发布代码,然后解释问题发生的位置:
public class MainActivity extends Activity
{
private TextView serverMessage;
private Thread thread;
private Socket clientSocket;
private String mesaj;
String answer = "";
String partial = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
serverMessage = (TextView)findViewById((R.id.textView));
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onPause() {
super.onPause();
}
public void Start(View v)
{
thread = new Thread(new Runnable() {
@Override
public void run() {
try {
clientSocket = new Socket("92.55.154.98", 100);
Log.d("Sending server", "SEnding " + "SELECT * FROM Pubs");
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())), true);
out.println("SELECT * FROM Pubs");
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
while ((partial = in.readLine()) != null) {
answer= answer + partial +"\n" ;
Log.e("In while", answer);
}
in.close();
clientSocket.close();
Log.e("After while", answer);
Message answer = null;
answer.obj=answer;
handler.sendMessage(answer);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
answer="";
//serverMessage.setText(answer);
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg)
{ Log.w("Message recieved ?? ", msg.obj.toString());
messageDisplay(msg.obj.toString());
}
};
public void messageDisplay(String mesaj)
{
serverMessage.setText(mesaj);
}
}
问题出现在 Start 方法中:
while ((partial = in.readLine()) != null) {
answer= answer + partial +"\n" ;
Log.e("In while", answer);
}
in.close();
clientSocket.close();
Log.e("After while", answer);
日志正确地向我显示了 while 循环内的答案字符串。 while 循环结束后,此方法不会运行任何其他内容。它不显示我在 while 循环之后放置的日志 Log.e("After while", answer);如果我关闭服务器,我设法显示第二个日志,但当它尝试运行其余代码时它崩溃了。
如果我取消注释 Start 方法末尾的这部分,结果会以某种方式显示:
thread.start();
answer="";
//serverMessage.setText(answer);
在这种情况下,只有当我按两次按钮时才会显示结果!
有人知道为什么会这样吗?有解决方案吗?
最佳答案
而不是
Message answer = null;
answer.obj=answer;
handler.sendMessage(answer);
这肯定会失败并出现NullpointerException
(如果你让它编译)尝试
handler.obtainMessage(0, answer).sendToTarget();
关于java - Android 客户端应用程序无法正确显示服务器答案/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35959553/