我有一個循環就打電話給服務:安卓:讓呼叫服務線程安全
context.startService(intent);
在和希望後,在服務完成其處理爲每個請求返回的結果。所以我傳遞一個唯一的ID來意圖區分響應。
但不幸的是,調用onStartCommand的startService不是線程安全的。這導致響應總是最後一個id,因爲意圖在稍後的調用中被改變。
的服務代碼是相似的:
public class MyService extends Service {
protected Bundle rcvExtras;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
rcvExtras = intent.getExtras();
// Todo with information in rcv Extra
BaseRestClient restClient = new BaseRestClient(rcvExtras.getString(Constants.INTENT_KEY_OBJECT_TYPE));
restClient.post(data, rcvExtras.getString(Constants.INTENT_KEY_URL), new CallBackHandler(this)); // This is an async call
return super.onStartCommand(intent, flags, startId);
}
private class CallBackHandler extends Handler {
private final WeakReference<MyService> myServiceRef;
public CallBackHandler(MyService myService) {
myServiceRef = new WeakReference<>(myService);
}
@Override
public void handleMessage(Message msg) {
Intent result = new Intent(Constants.WS_CALL_BACK);
rcvExtras.putInt(Constants.INTENT_KEY_STATUS, msg.what);
result.putExtras(rcvExtras);
log.info("Broadcast data");
sendBroadcast(result); // Broadcast result, actually the caller will get this broadcast message.
MyService myService = myServiceRef.get();
log.info("Stopping service");
myService.stopSelf(startId);
}
}
}
我怎樣才能讓服務調用線程安全的嗎?
有人可以幫我嗎? –
是的,這是我所有的代碼,沒有其他相關的代碼。 –