Правильный способ использования сокетов в приложении для Android

Я разрабатываю это приложение, и мне нужно в какой-то момент отправить данные (в основном, дубликаты и строки) на сервер. Я буду использовать TCP-сокет и DataOutput/InputStreams. Мне было интересно, что было бы лучшим способом сделать это. Должен ли я иметь отдельный класс для обработки соединения с использованием методов записи/чтения или, возможно, просто определять Sockets/Streams и т.д. В моем основном классе Activity в onCreate()? Возможна ли первая возможность? Любые примеры будут оценены.

пс. Должен ли я использовать другой поток для обработки соединения?

редактировать.
Поэтому, если я правильно понял, это должно быть правильно:

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);

Ответы

Ответ 1

Поскольку сетевые подключения могут занять много времени и сделать ваше приложение безоговорочным, если это делается в потоке пользовательского интерфейса, вы должны, вероятно, сделать это в AsyncTask. Если ваш AsyncTask достаточно сложный, его можно было бы реализовать в своем собственном java файле как должный публичный класс.

Этот ответ даст вам базовый скелет. AsyncTask позволяет легко взаимодействовать с пользовательским интерфейсом в начале и в конце загрузки вашего фона, если вам нужно показать индикацию прогресса.

Thread имеет тенденцию быть худшим выбором, так как по-прежнему остается проблема взаимодействия с пользовательским интерфейсом, когда ваш поток завершается, а также убедитесь, что поток не продолжает работу после завершения вашей деятельности; a AsyncTask также можно отменить, а затем onCancelled будет выполняться вместо onPostExecute.