2015-09-25 2 views
1

У меня есть цикл, который зовите к сервису:Android: сделать обслуживание вызова поточно-

context.startService(intent); 

в системе и хочу вернуть результат после того, как служба завершит свою обработку для каждого запроса. Поэтому я передаю уникальный идентификатор, чтобы иметь возможность отличить ответ.

Но, к сожалению, startService, вызывающий onStartCommand, не является потокобезопасным. Это приводит к тому, что ответ всегда является последним идентификатором, поскольку намерение было изменено при последующем вызове.

сервисный код аналогичен:

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); 
     } 
    } 
} 

Как я могу сделать обслуживание вызова поточно-?

+0

Не могли бы вы помочь мне? –

+0

Да, это все мой код, никаких других связанных с ним. –

ответ

2

Я вижу вашу проблему, это программная проблема, не вызванная каркасом. Здесь вы вызываете startService, пока не назовете stopself, ваш MyService является singleton, а ваши rcvExtras являются глобальной переменной и будут совместно использоваться потоками.

Это легко исправить:

  • Переместить декларацию rcvExtras методу рамки, здесь onStartCommand.
  • Расширьте CallBackHandler, чтобы разрешить ваши rcvExtras и использовать его после обратного вызова.

В настоящее время у вас нет никакой переменной, которую можно использовать совместно, и вы в безопасности.

Надеюсь, что эта помощь.

+0

А, да, вы спасете мою жизнь, спасибо вам большое. Глупый заглушка кода. –

Смежные вопросы