我应该在Android中使用AsyncTask来管理套接字连接吗?

时间:2016-06-16 15:42:09

标签: java android multithreading sockets android-asynctask

我正在Android中开发一个使用TCP套接字连接到服务器的应用程序。 我正在使用AsynkTask来连接应用程序。

应用程序在其整个生命周期中不会与服务器断开连接。即使应用程序进入休眠状态,AsynkTask仍会继续运行,并且套接字始终处于连接状态。

仅当服务器关闭套接字时(因为异常被抛出并且doInBackground()完成)或者当用户退出应用程序时(因为AsyncTask被取消),Socket才会断开连接

这是我的doInBackground()

    @Override
public Void doInBackground(Void ...pa){

        try {                                                    
            sock = new Socket(InetAddress.getByName(serv), port);            
        }
        catch(IOException ex) { errMessage = ex.getMessage() + "\n"; }



    try {
        if(sock != null) {                

            inStr = new DataInputStream(sock.getInputStream());
            outStr = new DataOutputStream(sock.getOutputStream());

            while(!isCancelled()) {
                if(((hbDataSize = inStr.read()) & 0xC0) == 0xC0){ 
                    lbDataSize = inStr.read(); 
                    packetSize = (hbDataSize << 8 & 0x3F00) + lbDataSize; 
                    buffer = new byte[packetSize-2];
                    inStr.read(buffer, 0, packetSize-2);
                    publishProgress(0);
                }
            }

        } else {               
            throw new IOException(errMessage);
        }
    }catch(IOException e) { // sin conexion salta a a excepcion
        errMessage = e.getMessage();
        publishProgress(2);
        isError = true;
    }
    return null;
}

无论如何,我只是放置代码,以便您可以看到方法。

我开始阅读有关AsyncTask的内容,它说我应该长时间使用AsyncTask。

  

理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent提供的各种API。包,如Executor,ThreadPoolExecutor和FutureTask。

我的应用程序工作正常,但我应该更改Executor的AsyncTask,还是ThreadPoolExecutor或FutureTask? 如果你认为我应该改变它,我为什么要改变它? 我一直在阅读关于这三个条款的内容,但如果我应该改变它,我就不会感到害羞。

1 个答案:

答案 0 :(得分:4)

如果你正在做你所描述的连续工作,最好使用服务,android将通过服务更好地管理资源。正如你所说,即使应用程序进入睡眠状态,(你的意思是设备吗?)。服务框架或包旨在执行此类操作。 AsyncTask用于次要下载操作,如图像和其他东西。但是,如果您依赖来自云服务的连续流,那么请使用服务。