在我的应用程序中,我有一个(后台)Service
,它在自己的进程中运行。为了与其他组件通信,我定义了一些AIDL接口:
interface MyService {
void addOnChangeListener(ServiceChangedListener listener);
void removeOnChangeListener(ServiceChangedListener listener);
}
interface ServiceChangedListener {
void onUserChanged(in User newUser);
}
以下是MyService
实施的服务。
public class UserService extends Service {
private RemoteCallbackList<ServiceChangedListener> listeners;
public class ServiceBinder extends MyService.Stub {
public void addOnChangeListener(ServiceChangedListener listener) {
listeners.register(listener);
}
public void removeOnChangeListener(ServiceChangedListener listener) {
listeners.unregister(listener);
}
}
// all the other implementation...
}
我的Activity
与Service
中的onStart
相关联,并在onStop
中与onServiceConnected
断开连接,同时它还会释放在public class MainAcitivity extends AppCompatActivity {
private ServiceListener listener;
private MyService service;
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, UserService.class);
bindService(intent, this, Context.BIND_AUTO_CREATE);
}
protected void onStop() {
super.onStop();
try { service.removeOnChangeListener(listener); }
catch (RemoteException e) { e.printStackTrace(); }
unbindService(this);
}
public void onServiceConnected(ComponentName className, IBinder service) {
service = MyService.Stub.asInterface(service);
try {
listener = new ServiceListener();
service.addOnChangeListener(listener);
} catch (RemoteException e) {
e.printStackTrace();
}
}
private class ServiceListener extends ServiceChangedListener.Stub {
public void onUserChanged(User u) throws RemoteException {
runOnUiThread(() -> { ... });
}
}
}
中注册的侦听器。< / p>
ArrayList
监听器的添加和删除方法只是按照您的预期在lftp -c "set sftp:auto-confirm true; open sftp://$DEVELOPMENT_DEPLOY_USER:$DEVELOPMENT_DEPLOY_PASSWORD@$DEVELOPMENT_DEPLOY_HOST:$DEVELOPMENT_DEPLOY_PORT; mirror -Rev ./somefolder_* $DEVELOPMENT_DESTINATION_FOLDER --ignore-time --parallel=10 --exclude .* --exclude .*/ --include ./*.json"
上运行,因此没有长期的工作。
LeakCanary以及Android工作室内存分析工具告诉我这会导致内存泄漏。如果我注释掉影响侦听器的行,则不会检测到内存泄漏。你有什么想法吗?
答案 0 :(得分:0)
我终于找到了答案!您必须使内部类静态并在其中使用WeakReference
。以下是Google工程师的official answer和简体中的here。祝所有有同样问题的人好运!