2017-02-08 12 views
2

Я сделал простой функциональный тест, однако я встретил странную проблему.Служба RxJava и Android

Функциональный тест: запуск службы в действии, а затем отправка сообщения в действие с использованием RxJava и boradcast в службе, наконец, получение сообщения в действии.

запуске службы:

Intent i = new Intent(this, StartIntentService.class); 
startService(i); 

посылая сообщение:

@Override 
protected void onHandleIntent(Intent intent) { 

    Observable.interval(0, 500, TimeUnit.MILLISECONDS) 
      .filter(integer -> { 
       return (integer < 400) && (integer % 3 == 0); 
      }) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(integer -> { 
       mIntent.putExtra("num", integer); 
       sendBroadcast(mIntent); 
      }); 
} 

приема сообщения:

class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (ACTIVITY_SERVICE_INTERACTIVE.equals(intent.getAction())) { 
      int res = intent.getIntExtra("num", -1); 
      mResTv.append(res + "" + "\t\t\t\t"); 
     } 
    } 
} 

ожидаемый результат: все номера могут быть делится на 3, однако реальный результат: все числа равны -1.

Если я заменил интервал метода на диапазон или добавлю метод: .observeOn (AndroidSchedulers.mainThread()), все идет хорошо.

Почему?

ответ

2

Observable.interval излучает Long значения, в то время как в onReceive извлекать значения с getIntExtra (вместо getLongExtra). Таким образом, getIntExtra возвращает значения, указанные вами по умолчанию (-1).

Observable.range испускает значения Integer, поэтому все идет так, как ожидалось.

+1

** Большое спасибо **. – Sawyer