我正在开发这个应用程序,我需要在某些时候将数据(主要是双打和字符串)发送到服务器。 我将使用TCP套接字和DataOutput / InputStreams。我想知道最好的方法是什么。我应该有一个单独的类来处理与实现的write / read方法的连接,或者只是在onCreate()中的主Activity类中定义Sockets / Streams等? 第一种方式甚至可能吗?任何例子都将不胜感激。
PS。我应该使用不同的线程来处理连接吗?
修改。
所以,如果我做对了,这应该是正确的:
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);
答案 0 :(得分:16)
由于网络连接可能会花费时间并且如果在UI线程上完成,您的应用会无响应,您应该在AsyncTask中执行这些操作。如果你的AsyncTask
足够复杂,那么值得在自己的java文件中作为适当的公共类实现。
This answer会给你基本的骨架。如果您需要显示一些进度指示,AsyncTask
可以在后台加载的开始和结束时轻松与UI进行交互。
Thread
往往是一个更糟糕的选择,因为当你的线程完成时你仍然会遇到UI交互的问题,并确保线程在你的活动完成后不继续它的工作;也可以取消AsyncTask
,然后执行onCancelled
而不是onPostExecute
。