【问题标题】:proper way of using sockets in android app在android应用程序中使用套接字的正确方法
【发布时间】:2011-03-24 21:41:24
【问题描述】:

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

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

【问题讨论】:

    标签: android sockets android-asynctask


    【解决方案1】:

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

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

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

    【讨论】:

    • 啊,太好了,我想更多的是传统线程,我会更多地研究 AsyncTask,如果我有任何问题,我会回来的。谢谢。
    • 我也刚刚为任何感兴趣的人找到了这个例子:stackoverflow.com/questions/5135438/…
    猜你喜欢
    • 2015-06-24
    • 2016-11-24
    • 2012-08-07
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多