我正在使用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");
}
}
所以我得到一个nullpointer因为服务还没有绑定。我如何检查活动是否已绑定服务?
我真正需要的是简单:创建活动 - >使用AIDL从服务获取信息 - >更新UI。如果我把一个按钮“更新”所有工作正常但我不知道如何自动执行此操作。有些想法? 我可以用:
做一个帖子while(conn.s==null)
;
updateUI();
但我认为它不优雅或高效。
答案 0 :(得分:0)
要测试您的服务是否已连接,请将此方法添加到ServiceConnection类中:
public boolean isConnected() {
return s == null;
}
另一个解决方案:在类中添加一个布尔值,并在connect / disconnect上设置为true / false。
重新使用API类的名称通常是一个非常糟糕的主意,因为在阅读所有导入之前,更难理解使用哪些实现。
答案 1 :(得分:0)
在onCreate中,您不应该执行在绑定服务之前无法执行的操作。您需要推迟这些操作并等待onServiceConnected被调用。
是不是onServiceConnected你正在寻找的“onConnectionEstablished回调”?在与服务建立连接时调用onServiceConnected