【发布时间】:2018-10-24 07:42:49
【问题描述】:
对于我的一个聋哑朋友,我正在尝试创建应用程序(用于智能手表和手机),当有人按门铃时会向他发出警告。智能手表会振动,这样他就知道有人在门前。
为了知道是否有人在按门铃,我创建了一个服务器,它通过套接字向电话发送消息。手机会在服务中监听这个,然后当它收到消息时,它会通过数据层 api 将数据发送到智能手表以进行振动。
现在我让后台服务正常工作,但它正在使用大量内存。几天后,我在手机上看到一条消息,说该应用程序正在使用大量内存,因此它会自动关闭该应用程序。我的问题是什么在我的服务中使用了大量内存?我使用的socket io库不能在后台使用吗?
(同样每隔几分钟,用户就会断开与服务器的连接并重新连接,这种情况会一直持续下去)
这是我创建的服务:
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
import nl.example.messenger.Messenger;
public class SocketIOService extends Service {
private final static String mSocketUrl = "https://example.io/";
private Socket mSocket;
private Messenger mMessenger;
private final LocalBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder{
public SocketIOService getService(){
return SocketIOService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
return false;
}
@Override
public void onCreate() {
super.onCreate();
initializeSocket();
addSocketHandlers();
mMessenger = new Messenger(this);
}
@Override
public void onDestroy() {
super.onDestroy();
closeSocketSession();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
private void initializeSocket() {
try{
IO.Options options = new IO.Options();
options.forceNew = true;
mSocket = IO.socket(mSocketUrl, options);
}
catch (Exception e){
Log.e("Error", "Exception in socket creation");
throw new RuntimeException(e);
}
}
private void closeSocketSession(){
mSocket.disconnect();
mSocket.off();
}
private void addSocketHandlers(){
mSocket.on("message", new Emitter.Listener() {
@Override
public void call(Object... args) {
mMessenger.sendMessage("Socket: Got a new message.");
}
});
mSocket.connect();
}
}
【问题讨论】:
-
这里没有足够的代码来做出这个决定。您提供的内容不太可能导致如此严重的内存泄漏。不太可能是 Socket.IO。有关如何分析内存的说明,请参阅 here。
-
除此之外,只有 1 个活动刚刚开始服务。但我会看看说明!
标签: java android performance websocket socket.io