AsyncTask创建一个Socket

时间:2015-07-06 15:06:55

标签: java android sockets android-asynctask

我在设置Socket连接时遇到了一些问题。

根据我的发现,构造函数Socket(InetAddress dstAddress, int dstPort)不能在main线程中使用。

这就是我的尝试:

CreateSocketTask.java

public class CreateSocketTask extends AsyncTask<InetAddress,Void,Socket>{
<...>

@Override
protected Socket doInBackground(InetAddress... params) {
    try
    {
        socket = new Socket(params[0], port);
        return socket;

    } catch(ConnectException e) {
        Log.e("SocketClient", "Error", e);

        return null;



    } catch(IOException e) {
        Log.e("SocketClient", "Error", e);
        return null;
    }
}

protected void onPostExecute() {
    }
}

然后在我的 SocketClient.java

public class SocketClient implements Runnable{
<...>
public void run()
{
    try
    {
        InetAddress serverAddress = InetAddress.getByName(serverIp);

        new CreateSocketTask().execute(serverAddress);


        try {
        /*Here, I want to retrieve the result of my CreateSocketTask to use it in my new Thread, I tried CreateSocketTask.get() but without any success*/

        new Thread(new SocketReader(new BufferedReader(new InputStreamReader(socket.getInputStream())), observerList)).start();
        }

如何设置套接字连接?

这会有用吗?

我可以简单地创建一个新线程来执行我的Socket创建,而不是创建服务吗?像那样:

Thread SocketThread =new Thread(new Runnable() {

    @Override
    public void run() {
        try {Socket socket = new Socket(serverAddress,port);}
        catch (IOException e){}
        }
    });
    SocketThread.run();
    try {
    new Thread(new SocketReader(new BufferedReader(new InputStreamReader(socket.getInputStream())), observerList)).start();
    }

3 个答案:

答案 0 :(得分:2)

不要使用AsyncTask,这个类的目的是根据“用于短操作(最多几秒)的文档”做很少的工作。“

因此,您最好实施服务来执行I / O请求http://developer.android.com/guide/components/services.html

答案 1 :(得分:1)

当您想使用套接字时,AsyncTask没用。当您需要在separeted线程中进行密集工作,然后在最后更改UI状态时,您应该使用AsyncTask。经典应用程序正在发出HTTP请求以从远程服务器检索某些数据,然后更新例如Adapter和UI组件。

您应该记住,如果您运行该服务并不意味着您在单独的线程中完成工作,那么无论如何都可以使用该服务进行后台工作。 文档说

  

服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。

因此,您必须启动一个单独的线程来处理服务器端并接受连接。每个连接都应该在一个单独的线程中处理,这样你就可以同时拥有多个连接。

相同的概念对客户端有效。

如果要更新UI,可以使用回调方法并更新主线程中的UI。

答案 2 :(得分:0)

问题解决了。

公共类中,SocketClient实现了Runnable 我有方法public SocketClient(int port, String serverIp, Collection<Observer> observerList, Context context),我碰巧在其中创建了socket = new Socket(serverAddress, port)

要在我的 MapEngine.java 中完成这项工作,我只需添加

this.SocketClient = new SocketClient(-THEPORT-,-THEIPADDRESS-,null,this)

在我的构造函数中,然后通过调用

创建了我的套接字
new Thread(SocketClient).start();