Java AsyncTask创建套接字

Java AsyncTask创建套接字,java,android,sockets,android-asynctask,Java,Android,Sockets,Android Asynctask,我在设置套接字连接时遇到一些问题 根据我的发现,构造函数套接字(InetAddress dstAddress,int dstPort)不能在main线程中使用 这就是我所尝试的: 在CreateSocketTask.java中 不要使用AsyncTask,这个类的目的是根据“用于短操作(最多几秒钟)”的文档进行少量工作 因此,您最好实现一个服务来执行I/O请求异步任务在您想要使用套接字时没有用处。当需要在分离线程中执行密集工作时,应使用AsyncTask,然后在最后更改UI状态。经典应用程序发出

我在设置套接字连接时遇到一些问题

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

这就是我所尝试的:

在CreateSocketTask.java中


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


因此,您最好实现一个服务来执行I/O请求

异步任务在您想要使用套接字时没有用处。当需要在分离线程中执行密集工作时,应使用AsyncTask,然后在最后更改UI状态。经典应用程序发出HTTP请求,从远程服务器检索一些数据,然后更新适配器,然后更新UI组件

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

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

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

同样的概念也适用于客户端

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

问题已解决

在public类SocketClient implements Runnable中,我有一个方法
public SocketClient(int-port,String-serverIp,Collection-observerList,Context-Context)
,在这个方法中我碰巧创建了
socket=newsocket(serverAddress,port)

为了在我的MapEngine.java中实现这一点,我只添加了

this.SocketClient = new SocketClient(-THEPORT-,-THEIPADDRESS-,null,this)
在我的构造函数中,然后通过调用

new Thread(SocketClient).start();

你能发布你的整个错误日志吗?你得到了哪个错误?/*在这里,我想检索我的CreateSocketTask的结果以便在我的新线程中使用它,我尝试了CreateSocketTask.get(),但没有成功*/。那确实是个错误的地方。您应该在CreateSocketTask的onPostExecute中执行此操作。我收到一个android.os.NetworkOnMainThreadException错误异步任务中没有I/O请求。只有连接设置。感谢您的回复。我会研究一下服务解决方案。我编辑了我的帖子,如果你有任何线索,我会再问你一个问题
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();
    }
this.SocketClient = new SocketClient(-THEPORT-,-THEIPADDRESS-,null,this)
new Thread(SocketClient).start();