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

kot*_*osh 15 sockets android android-asynctask

我正在开发这个应用程序,我需要在某些时候发送数据(主要是双打和字符串)到服务器.我将使用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;
}

}
Run Code Online (Sandbox Code Playgroud)

我会在我的Activity类中使用类似的东西:

ConnectionHandler conhandler = new ConnectionHandler();
    conhandler.execute();
    conhandler.writeToStream(lat , lon);
Run Code Online (Sandbox Code Playgroud)

Mat*_*lis 16

由于网络连接可能会花费时间并且如果在UI线程上完成,您的应用程序将无响应,您应该在AsyncTask中执行它们.如果你的AsyncTask内容足够复杂,那么在自己的java文件中作为一个合适的公共类实现它是值得的.

这个答案会给你基本的骨架.AsyncTask如果您需要显示一些进度指示,则可以在后台加载的开始和结束时轻松与UI进行交互.

Thread往往是一个更糟糕的选择,因为当你的线程完成时你仍然会遇到UI交互问题,并确保线程在你的活动完成后不能继续工作; 一个AsyncTask也可以被取消,然后onCancelled将得到执行,而不是onPostExecute.