Я провел несколько дней и прочитал много сообщений по этому делу, но я еще не решил проблемную проблему. Память неограниченно увеличивается на несколько килобайт. После одного часа подключения к серверу без какой-либо связи занимаемая память увеличилась с 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 части.
Это лучший подход?