每个示例都有Service onStart(),并在一段时间内从Service调用方法(如onClick之后)。直到那个onClick服务被绑定。Android的Java - 如何使活动等待,直到服务绑定?
我得到的问题,服务需要一段时间,直到它被绑定,它异步绑定。 因此,如果我启动并且需要立即从服务获取一些数据的活动 - 它会崩溃,因为它尚未绑定。所以我需要等待我的活动等待连接完成。我怎么做?
每个示例都有Service onStart(),并在一段时间内从Service调用方法(如onClick之后)。直到那个onClick服务被绑定。Android的Java - 如何使活动等待,直到服务绑定?
我得到的问题,服务需要一段时间,直到它被绑定,它异步绑定。 因此,如果我启动并且需要立即从服务获取一些数据的活动 - 它会崩溃,因为它尚未绑定。所以我需要等待我的活动等待连接完成。我怎么做?
我想你想要的是:http://developer.android.com/guide/components/bound-services.html。
在此页面,您可以找到:
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
// We've bound to LocalService, cast the IBinder and get LocalService instance
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
的onServiceConnected
方法被调用时,该服务已准备就绪,你可以做你的东西里(或使用mBound属性)。
要绑定到你的服务,使用:
// Bind to LocalService
Intent intent = new Intent(this, LocalService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
您可以利用一个pendingList变量来处理这种情况:
private ICoreService mService;
private boolean mConnected = false;
private boolean mConnecting = false;
private List<Something> mPendingTasks = new ArrayList<Something>;
private void bindService() {
try {
Intent service = new Intent();
service.setClassName(Constants.THE_SERVICE_PACKAGE_NAME, Constants.THE_SERVICE_FULL_NAME);
mContext.bindService(service, mServiceConnection, Context.BIND_AUTO_CREATE);
mConnecting = true;
} catch (Exception e) {
//handle exception
}
}
public void serviceDoSomething(Something task) {
try {
if (mService == null) {
synchronized (mPendingTasks) {
mPendingTasks.add(task);
}
} else {
mService.doSomething(task);
}
} catch (Exception e) {
//handle exception
}
}
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mConnected = false;
mConnecting = false;
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mConnected = true;
mConnecting = false;
mService = ICoreService.Stub.asInterface(service);
drainPendingTasks();
}
};
private void drainPendingTasks() {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (mPendingTasks) {
try {
if (!mPendingTasks.isEmpty()) {
for (Something task : mPendingTasks) {
mService.doSomething(task);
}
mPendingTasks.clear();
}
} catch (Exception e) {
//handle exception
}
}
}
}).start();
}
是的,我知道。但是如果你试图做一些像localService.myMethod(); - 你的活动会崩溃,因为绑定不会立即发生,如果你问mBound是真还是假 - 肯定会是错误的。我需要的是某种监听器,当mBound将成为true时,活动可以继续 – user2234594
然后,您可以将代码直接放在'onServiceConnected'中。那有什么问题? – Brtle
太棒了!现在这就是我正在寻找的答案!)我只是移动所有活动 – user2234594