【发布时间】:2016-03-12 15:28:12
【问题描述】:
我整天都在努力制作一个 Android 客户端应用程序。我设法从服务器获得了答案,但我无法在文本视图中正确显示它。我使用此处的其他答案或 Youtube 视频制作了该应用程序。
应用程序应该非常简单。然后我按下一个按钮,它会向服务器发送一个 SQL 查询,并从数据库中返回一些数据,这些数据应该显示在一个文本视图中。
我会贴出代码,然后说明问题出在哪里:
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);
在这种情况下,他的结果只有在我按下按钮两次时才会显示!
有人知道为什么会这样吗?有解决办法吗?
【问题讨论】:
-
After the while loop ends。不,它没有结束。它停留在 while 循环中。 -
是的,我设法修复了它,现在它可以正常工作了。由于 BufferedReader,while 循环永远不会结束。显然,在它到达我从服务器带来的数据被放入答案字符串之后它什么也没做,所以 while 循环永远不会结束,因为从来没有一个 null 应该结束一个循环。只是更改了带来服务器应答的变量类型。
标签: java android client-server