0

我正在使用 AIDL。我有一项服务和一项活动。在 onCreate 函数中,我绑定了服务,我想更新 UI:

private ServiceConnection conn = null;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    bindService();
    String name = conn.s.getName();

}
public class ServiceConnection implements ServiceConnection {
public IService s = null;

public void onServiceConnected(ComponentName className, IBinder boundService) {
    s = IService.Stub.asInterface((IBinder) boundService);
    Log.d(getClass().getSimpleName(), "onServiceConnected()");
}

public void onServiceDisconnected(ComponentName className) {
    s = null;
    Log.d(getClass().getSimpleName(), "onServiceDisconnected");
}
}

所以我得到一个空指针,因为该服务尚未绑定。如何检查活动是否绑定了服务?

我真正需要的很简单:创建活动 -> 使用 AIDL 从服务获取信息 -> 更新 UI。如果我放一个“更新”按钮一切正常,但我不知道如何自动执行此操作。有什么想法?我可以做一个线程:

while(conn.s==null)
  ;
updateUI();

但我认为它既不优雅也不高效。

4

2 回答 2

0

要测试您的服务是否已连接,只需将此方法添加到您的 ServiceConnection 类中:

public boolean isConnected() {
   return s == null;
}

另一种解决方案:在您的类中添加一个布尔值,并在连接/断开连接时设置为真/假。

重用 API 类的名称通常是一个非常糟糕的主意,因为更难理解在读取所有导入之前使用了哪些实现。

于 2013-01-10T17:07:08.523 回答
0

在 onCreate 中你不应该做在服务绑定之前你不能做的事情。您需要推迟这些操作并等待调用 onServiceConnected。

onServiceConnected 不是您正在寻找的“onConnectionEstablished 回调”吗?当与服务建立连接时调用 onServiceConnected

于 2013-01-10T18:00:24.613 回答