Android 远程服务是否可以从活动中引用成员类实例

Android 远程服务是否可以从活动中引用成员类实例,android,Android,我指的是这个优秀的教程,它讨论了在单独的进程中运行服务 在远程服务中,有一种方法可以从活动中删除传递的侦听器 远程服务 活跃 我怀疑removeListener是否能正常工作。我通过在远程服务中使用以下代码来进行快速测试 远程服务 我得到以下结果 before removing listner -> 1 after removing listner -> 1 我的猜测是,即使活动在addListener和removeListner期间传递相同的TweetCollectorListe

我指的是这个优秀的教程,它讨论了在单独的进程中运行服务

在远程服务中,有一种方法可以从活动中删除传递的侦听器

远程服务 活跃 我怀疑
removeListener
是否能正常工作。我通过在远程服务中使用以下代码来进行快速测试

远程服务 我得到以下结果

before removing listner -> 1
after removing listner -> 1
我的猜测是,即使活动在
addListener
removeListner
期间传递相同的
TweetCollectorListener.Stub
实例,但在服务端
addListener
removeListner
正在构建两个不同的
TweetCollectorListener
实例

我可以通过以下日志进一步确认这一点

Activity calls service's addListener, by passing in com.mindtherobot.samples.tweetservice.TweetViewActivity$2@427c1190
In service's addListener, TweetCollectorListener is com.mindtherobot.samples.tweetservice.TweetCollectorListener$Stub$Proxy@427d68b0
Activity calls service's removeListener, by passing in com.mindtherobot.samples.tweetservice.TweetViewActivity$2@427c1190
In service's removeListener, TweetCollectorListener is com.mindtherobot.samples.tweetservice.TweetCollectorListener$Stub$Proxy@427d7188

那么,有没有办法将侦听器从远程服务中删除?有时,我想删除一个旧的侦听器,并附加一个新的侦听器。

在远程服务中,为了比较
TweetCollectorListener
对象,您需要使用底层的
活页夹
对象,如下所示:

@Override
public void removeListener(TweetCollectorListener listener)
    throws RemoteException {

    synchronized (listeners) {
        Log.i("CHEOK", "before removing listner -> " + listeners.size());
        for (TweetCollectorListener tcl : listeners) {
            if (tcl.asBinder() == listener.asBinder()) {
                listeners.remove(tcl);
                break;
            }
        }
        Log.i("CHEOK", "after removing listner -> " + listeners.size());
    }
}

在远程服务中,为了比较
TweetCollectorListener
对象,您需要使用底层
Binder
对象,如下所示:

@Override
public void removeListener(TweetCollectorListener listener)
    throws RemoteException {

    synchronized (listeners) {
        Log.i("CHEOK", "before removing listner -> " + listeners.size());
        for (TweetCollectorListener tcl : listeners) {
            if (tcl.asBinder() == listener.asBinder()) {
                listeners.remove(tcl);
                break;
            }
        }
        Log.i("CHEOK", "after removing listner -> " + listeners.size());
    }
}

谢谢我要试试。谢谢。我要试试看。
Activity calls service's addListener, by passing in com.mindtherobot.samples.tweetservice.TweetViewActivity$2@427c1190
In service's addListener, TweetCollectorListener is com.mindtherobot.samples.tweetservice.TweetCollectorListener$Stub$Proxy@427d68b0
Activity calls service's removeListener, by passing in com.mindtherobot.samples.tweetservice.TweetViewActivity$2@427c1190
In service's removeListener, TweetCollectorListener is com.mindtherobot.samples.tweetservice.TweetCollectorListener$Stub$Proxy@427d7188
@Override
public void removeListener(TweetCollectorListener listener)
    throws RemoteException {

    synchronized (listeners) {
        Log.i("CHEOK", "before removing listner -> " + listeners.size());
        for (TweetCollectorListener tcl : listeners) {
            if (tcl.asBinder() == listener.asBinder()) {
                listeners.remove(tcl);
                break;
            }
        }
        Log.i("CHEOK", "after removing listner -> " + listeners.size());
    }
}