活动和服务之间的通信导致内存泄漏

时间:2018-03-11 10:44:36

标签: android android-service aidl

在我的应用程序中,我有一个(后台)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...
}

我的ActivityService中的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工作室内存分析工具告诉我这会导致内存泄漏。如果我注释掉影响侦听器的行,则不会检测到内存泄漏。你有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我终于找到了答案!您必须使内部类静态并在其中使用WeakReference。以下是Google工程师的official answer和简体中的here。祝所有有同样问题的人好运!