RxJava在服务中

时间:2017-12-07 18:46:09

标签: android service notifications rx-java retrofit2

在我的应用中进行网络通话我使用的是RxJava 1.1.6Retrofit 2.1.0。我需要实现离线模式 - 将我应用中的所有数据与后端数据同步。我尝试使用Service + RxJava但我遇到了一些问题 - 我想从我的RxJava链发送一些通知,但看起来我不能这样做。似乎这个链在不同的线程中执行,而不是在我的服务工作的那个线程中执行。但我没有更改RxJava链的线程。)下面我附上了我运行的代码。

protected void handleIntent(@Nullable Intent intent) {
    Log.d(TAG, "################ handleIntent ");
    if (isStarted) {
      return;
    }

    final ArrayList<Integer> languageKeys = intent.getIntegerArrayListExtra(LANGUAGES_KEY);
    final ArrayList<Integer> currencyKeys = intent.getIntegerArrayListExtra(CURRENCY_KEY);

    Log.d(TAG, "handleIntent: ");
    showStartLoadingNotifications(NOTIFICATION_ID, "Test: Data sync started"); //this one works fine
   Observable.just(null)
      .flatMap(o -> networkUtils.networkAvailable())
      .filter(isRequestAllowed -> isRequestAllowed)
      .flatMap(isRequestAllowed -> {
        if (isRequestAllowed) {
          showStartLoadingNotifications(NOTIFICATION_ID, "Data sync started"); //this one doesn't work
        } else {
          stopSelf();
          hideNotification(NOTIFICATION_ID);
        }
        return just(isRequestAllowed);
      })
      .doOnNext(o -> isStarted = true)
      .doOnNext(o -> {
        DaoMaster.dropAllTables(daoSession.getDatabase(), true);
        DaoMaster.createAllTables(daoSession.getDatabase(), true);
      })
      .concat(from(prepareRequests(languageKeys, currencyKeys)))
      .subscribe(loadAllResponse -> {
        },
        throwable -> {
          Log.d(TAG, throwable.getMessage());
          isStarted = false;
        }, () -> {
          isStarted = false;
          stopSelf();
        });
    Log.d(TAG, "##############  handleIntent: finished");
  }

prepareRequests(languageKeys, currencyKeys)方法返回List<Observable<LoadAllResponse>>。 所有工作正常的服务按预期工作:数据正在下载并存储在数据库中,但我无法将通知发送到系统。

有人遇到过类似的问题吗?也有人知道它在什么线程中运行以及如何更改此链的线程以获得发送通知的能力?

1 个答案:

答案 0 :(得分:0)

来自documentation

必填通知内容 Notification对象必须包含以下内容:

  • 一个小图标,由setSmallIcon()设置。
  • 标题,由setContentTitle()设置。
  • 详细文本,由setContentText()设置。

在Android 8.0(API级别26)及更高版本上,一个有效的通知通道ID,由setChannelId()设置或在创建通道时在NotificationCompat.Builder构造函数中提供。

您缺少setContentTitle()