java - Android 客户端应用程序无法正确显示服务器答案/

标签 java android client-server

我一整天都在努力制作 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/

相关文章:

java - C++ 中的析构函数(与 Java 相比)

Android单服务器多客户端数据同步

python - 套接字编程问题 - python

java - 通过Zookeeper运行的Java程序

java - 如何使用 Java8s lambdas 改进日志记录机制

java - Java 中使用的 Heron 公式,但值错误

java - 尝试获取正确的月份以显示最高和最低值

android - android api < 16 中的 Codenameone LocalNotification 以及当应用程序从最近删除时

android - 动态壁纸中的动态文本

java - 如何解决 OutOfBounds BuildTime 错误 - api 28