【问题标题】:Is it possible for remote service to refer a member class instance from an Activity远程服务是否可以从 Activity 引用成员类实例
【发布时间】:2013-02-20 15:49:04
【问题描述】:

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

在远程服务中,有一种方法可以移除从 Activity 传递的监听器。

在远程服务中

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

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

活动中

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 实例,但是在服务端 addListenerremoveListner 正在构建两个不同的 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

那么,有什么方法可以从远程服务中删除监听器?有时,我想移除一个旧的监听器,并附加新的监听器。

【问题讨论】:

    标签: android


    【解决方案1】:

    在远程服务中,为了比较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());
        }
    }
    

    【讨论】:

    • 谢谢。打算试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    相关资源
    最近更新 更多