gpt4 book ai didi

android - 在 Android 应用程序中使用套接字的正确方法

转载 作者:可可西里 更新时间:2023-11-01 18:46:08 27 4
gpt4 key购买 nike

我正在开发这个应用程序,我需要在某个时候将数据(主要是 double 和字符串)发送到服务器。我将使用 TCP 套接字和 DataOutput/InputStreams。我想知道什么是最好的方法。我是否应该有一个单独的类来处理与实现的写/读方法的连接,或者可能只是在我的 onCreate() 主 Activity 类中定义套接字/流等?第一种方法甚至可能吗?任何示例将不胜感激。

附言。我应该使用不同的线程来处理连接吗?

编辑。
所以如果我做对了,这应该是正确的:

public class ConnectionHandler extends AsyncTask<Void, Void, Void>{

public static String serverip = "192.168.1.100";
public static int serverport = 7777;
Socket s;
public DataInputStream dis;
public DataOutputStream dos;
public int message;

@Override
protected Void doInBackground(Void... params) {

try {
Log.i("AsyncTank", "doInBackgoung: Creating Socket");
s = new Socket(serverip, serverport);
} catch (Exception e) {
Log.i("AsyncTank", "doInBackgoung: Cannot create Socket");
}
if (s.isConnected()) {
try {
dis = (DataInputStream) s.getInputStream();
dos = (DataOutputStream) s.getOutputStream();
Log.i("AsyncTank", "doInBackgoung: Socket created, Streams assigned");

} catch (IOException e) {
// TODO Auto-generated catch block
Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket not connected");
e.printStackTrace();
}
} else {
Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket is closed");
}
return null;
}

public void writeToStream(double lat, double lon) {
try {
if (s.isConnected()){
Log.i("AsynkTask", "writeToStream : Writing lat, lon");
dos.writeDouble(lat);
dos.writeDouble(lon);
} else {
Log.i("AsynkTask", "writeToStream : Cannot write to stream, Socket is closed");
}
} catch (Exception e) {
Log.i("AsynkTask", "writeToStream : Writing failed");
}
}

public int readFromStream() {
try {
if (s.isConnected()) {
Log.i("AsynkTask", "readFromStream : Reading message");
message = dis.readInt();
} else {
Log.i("AsynkTask", "readFromStream : Cannot Read, Socket is closed");
}
} catch (Exception e) {
Log.i("AsynkTask", "readFromStream : Writing failed");
}
return message;
}

}

我会在我的 Activity 类中使​​用这样的东西:

ConnectionHandler conhandler = new ConnectionHandler();
conhandler.execute();
conhandler.writeToStream(lat , lon);

最佳答案

如果在 UI 线程上完成网络连接可能会占用时间并使您的应用无响应,因此您应该在 AsyncTask 中完成它们.如果您的 AsyncTask 足够复杂,则值得在其自己的 java 文件中将其作为适当的公共(public)类实现。

This answer会给你基本的骨架。如果您需要显示一些进度指示,AsyncTask 可让您在后台加载开始和结束时轻松与 UI 交互。

Thread 往往是一个更糟糕的选择,因为当您的线程完成时您仍然面临 UI 交互的问题,以及确保线程在您的 Activity 完成后不会继续其工作;也可以取消 AsyncTask,然后执行 onCancelled 而不是 onPostExecute

关于android - 在 Android 应用程序中使用套接字的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5425923/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com