几天后android变慢了

时间:2016-07-04 03:52:09

标签: android tcp android-asynctask

我的应用程序通过TCP连接每0.5秒调用一次服务器请求,并且还连接到用于控制led按钮的硬件(使用jni库)。

当应用程序启动时,它会启动与服务器的TCP连接并保持连接,直到应用程序关闭。每0.5秒我使用AsyncTask从服务器发送和接收数据包。 这是代码。

private class RequestToServer extends AsyncTask<byte[],Void,byte[]> {
    String dstAddress = "192.168.1.197";
    int dstPort = 8000;
    String response = "";

    @Override
    protected byte[] doInBackground(byte[]... params) {
        if(mSocket == null || !mSocket.isConnected()){
            mSocket =  new Socket();
            InetSocketAddress socketAddress = new InetSocketAddress(dstAddress, dstPort);
            try{
                mSocket.setSoTimeout(3000);
                mSocket.connect(socketAddress,5000);
            }catch (SocketException e) {
                e.printStackTrace();
                return null;
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }

            try {
                dataOutputStream = new DataOutputStream(mSocket.getOutputStream());
                dataInputStream = new DataInputStream(mSocket.getInputStream());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            Log.i(TAG, "Connection Generated");
        }else{
            Log.i(TAG, "Connection Alive");
        }

        byte[] result = null;
        try {
            byte[] buffer = new byte[2048];
            if(mSocket.isConnected()){
                dataOutputStream.write(params[0]);
                Log.i(TAG,"send data : "+params[0]);
            }

            int bytesRead;
            if((bytesRead = dataInputStream.read(buffer)) != -1){
                Log.i(TAG,"bytesRead size: "+bytesRead);
                result = new byte[bytesRead];
                result = Arrays.copyOfRange(buffer,0,bytesRead);
                buffer = null;
                Log.i(TAG,"data received~ : "+result);
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

        }
        return result;
    }

    @Override
    protected void onPostExecute(byte[] s) {
        super.onPostExecute(s);
    }
}

我正在使用两个处理程序来继续请求服务器并与硬件通信(每1秒获取其状态和控制led状态)

它可以正常工作几天但在此之后,应用程序突然变慢,有时按钮会一直闪烁。

当我看到内存日志时,内存没有问题。 如果您对上面的代码有任何可疑点或问题,请告诉我。

1 个答案:

答案 0 :(得分:0)

当设备处于睡眠状态时,您将面临此问题。

设备的屏幕关闭后,设备进入睡眠状态。这样做是为了节省电池。

如果要在设备处于睡眠状态时进行一些后台操作,则需要获取部分唤醒锁并完成工作。

问题在于,您希望每隔0.5秒发送一次此消息,因此您几乎不会释放唤醒锁定。因此,使用唤醒锁可以解决您的问题,但它会非常快地耗尽电池。

https://developer.android.com/reference/android/os/PowerManager.html

我不知道每次从服务器提取数据的确切用例,但您可能会考虑使用像GCM这样的服务器推送而不是不断地提取数据。