gpt4 book ai didi

android - 远程服务是否可以从 Activity 引用成员类实例

转载 作者:行者123 更新时间:2023-11-30 03:46:01 26 4
gpt4 key购买 nike

我指的是这个优秀的教程 Android Architecture Tutorial: Developing an App with a Background Service (using IPC) ,它讨论了在单独的进程中运行服务。

在 Remote Service 中,有一种方法可以删除从 Activity 传递的监听器。

在远程服务中

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

synchronized (listeners) {
listeners.remove(listener);
}
}

Activity 中

private TweetCollectorListener.Stub collectorListener = new TweetCollectorListener.Stub() {
@Override
public void handleTweetsUpdated() throws RemoteException {
updateTweetView();
}
};

@Override
protected void onDestroy() {
super.onDestroy();

try {
api.removeListener(collectorListener);
unbindService(serviceConnection);
} catch (Throwable t) {
// catch any issues, typical for destroy routines
// even if we failed to destroy something, we need to continue destroying
Log.w(TAG, "Failed to unbind from the service", t);
}

Log.i(TAG, "Activity destroyed");
}

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

在远程服务中

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

synchronized (listeners) {
Log.i("CHEOK", "before removing listner -> " + listeners.size());
listeners.remove(listener);
Log.i("CHEOK", "after removing listner -> " + listeners.size());
}
}

我得到以下结果。

before removing listner -> 1
after removing listner -> 1

我的猜测是,尽管 Activity 在 addListenerremoveListner 期间传递了相同的 TweetCollectorListener.Stub 实例,但是有 2 个不同的实例TweetCollectorListener 正在服务端 addListenerremoveListner 中构建。

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

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对象,需要使用底层的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());
}
}

关于android - 远程服务是否可以从 Activity 引用成员类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14984113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com