【问题标题】:android getting slow after a few days几天后android变慢了
【发布时间】:2016-11-05 17:07:09
【问题描述】:

我的应用通过 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 状态)

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

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

【问题讨论】:

  • 您好,您介意补充一下为什么要每 0.5 秒连接一次服务器吗?
  • 因为这个应用程序适用于某些设备的监视器和控制器。如果某些数据发生更改,则应在屏幕上进行更新。
  • 那么为什么不简单地通过发生变化时发送数据。而不是在大部分时间没有任何变化的情况下不断利用设备的资源。
  • 我没有对服务器的授权,所以我不知道数据什么时候改变了。保持从服务器发送/接收数据会是一个主要问题吗?那为什么几天后会出现问题?
  • 好吧,在我看来,可能有三种情况可能会妨碍您的连接。 1. 可能只是因为您的网络很慢(不仅仅是 ping 的速度),但我认为并非如此, 2. 这可能是因为您每次需要连接时都在重新初始化您的 Socket。在网络通信中,与设备连接通常比数据传输(协议到位)花费更长的时间。因此,请尝试连接一次并稍后使用该连接。 3. 可能是 GC 无法摆脱所有额外的资源。

标签: android tcp android-asynctask


【解决方案1】:

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

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

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

这里的问题是您希望每 0.5 秒发送一次此消息,因此您实际上永远不会释放唤醒锁。因此,使用唤醒锁可以解决您的问题,但会很快耗尽电池电量。

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

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

【讨论】:

  • 感谢您的快速响应。但我不确定这是电池问题。据我所知,屏幕永远不会关闭,因为它始终连接到电源,并且应根据要求 24/7 全天候显示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2018-07-11
相关资源
最近更新 更多