【发布时间】:2013-03-16 20:19:26
【问题描述】:
我正在使用 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");
}
}
所以我得到一个空指针,因为该服务尚未绑定。如何检查 Activity 是否绑定了服务?
我真正需要的很简单:创建活动 -> 使用 AIDL 从服务获取信息 -> 更新 UI。如果我放一个“更新”按钮一切正常,但我不知道如何自动执行此操作。有什么想法? 我可以做一个线程:
while(conn.s==null)
;
updateUI();
但我认为它既不优雅也不高效。
【问题讨论】:
-
绑定服务是异步的。您只能在连接侦听器被通知后使用它,即在 onConnectionEstablished 或类似的东西中。
-
你有 onServiceConnected ,它在服务连接时被调用。从该方法更新 UI。为什么不呢?
-
如果你真的想要你可以让 onCreate 等待服务被绑定的通知。但要小心停止 UI
-
我找不到像“onConnectionEstablished”这样的东西。我无法从 onServiceConnected 更新 UI,因为连接是异步的。