每個示例都有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