Утечка памяти в сервисе входящих сообщений Android - PullRequest
0 голосов
/ 15 сентября 2018

Я провел несколько дней и прочитал много сообщений по этому делу, но я еще не решил проблемную проблему. Память неограниченно увеличивается на несколько килобайт. После одного часа подключения к серверу без какой-либо связи занимаемая память увеличилась с 9,2 до 10,6 МБ, и увеличилась часть Java. Это услуга:

package com.androidsrc.client;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.StrictMode;
import android.util.Log;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketService extends Service {
    public static final String SERVERIP = "192.168.0.11"; //your computer IP address should be written here
public static final int SERVERPORT = 1500;

PrintWriter outx = null;

int SDK_INT = android.os.Build.VERSION.SDK_INT;


public SocketService() {
}
public class LocalBinder extends Binder {
    public SocketService getService() {
        System.out.println("I am in Localbinder ");
        return SocketService.this;

    }
}
private final IBinder myBinder = new LocalBinder();

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    return myBinder;
}
@Override
public void onCreate() {
    super.onCreate();
    if (SDK_INT > 8)
    {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
    System.out.println("I am in on create");
}

public void IsBoundable(){
    Toast.makeText(this,"I bind like butter", Toast.LENGTH_LONG).show();
}

public void sendMessage(String message){
    if (outx != null && !outx.checkError()) {// && !out.checkError()
        System.out.println("in sendMessage "+message);

        outx.print(message+System.getProperty("line.separator"));
        outx.flush();
    }
}

@Override
public int onStartCommand(Intent intent,int flags, int startId){
    super.onStartCommand(intent, flags, startId);
    System.out.println("I am in on start");
    //  Toast.makeText(this,"Service created ...", Toast.LENGTH_LONG).show();
    Runnable connect = new connectSocket();
    new Thread(connect).start();
    return START_STICKY;
}
class connectSocket implements Runnable {
    private BufferedReader in = null;
    private String content = null;
    private Socket socket;
    //InetAddress serverAddr;

    private connectSocket () {

        try {

            //here you must put your computer's IP address.
            //serverAddr = InetAddress.getByName(SERVERIP);
            Log.e("TCP Client", "C: Connecting...");
            //create a socket to make the connection with the server

            //socket = new Socket(serverAddr, SERVERPORT, 2000);
            socket = new Socket();
            socket.connect(new InetSocketAddress(SERVERIP, SERVERPORT),21000);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            outx = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

        } catch (UnknownHostException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }
    @Override
    public void run() {
        try {
            while((content = in.readLine()) != null) {
                Log.i("run----", "---------" + content);
                        //System.gc(); I tryed but no fortune
                //break;//if this is uncommented second messagge not received
            }

        } catch (IOException e) {

            e.printStackTrace();

        }
    }

}


@Override
public void onDestroy() {
    super.onDestroy();
    try {
        //socket.close();//if only declared global in class
    } catch (Exception e) {

        e.printStackTrace();
    }
    //socket = null;//if only declared global in class
}
}

Это часть кода, которая увеличивает память:

public void run() {
    try {
        while((content = in.readLine()) != null) {
            Log.i("run----", "---------" + content);
                    //System.gc(); I tryed but no fortune
            //break;//if this is uncommented second messagge not received
        }

Для того, чтобы иметь активную службу в течение неопределенного времени и всегда слушать сообщения, что является лучшим способом? Я уже пробовал класс, основанный на AsyncTask, где я решил все проблемы с памятью, слушая в режиме реального времени, но AsyncTask не рекомендуется для очень длительных операций в то время, когда я пытался с сервисом, но я не могу выйти из указанной проблемы. Заранее спасибо.

Редакция: Я попытался использовать Thread вместо Runnable следующим образом:

class connectSocket extends Thread {

и

Thread connect = null;
connect = new connectSocket();
connect.start();

в onStartCommand Я заметил, что после 3 минут неактивности отправки / получения память загрузилась, несмотря на то, что за эти 3 минуты продолжал расти в Java и Native части. Это лучший подход?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...