2017-01-12 4 views
1

Ich habe Probleme mit rxJava für Android. Ich verbringe viel Zeit, um mein Problem zu lösen, etwa einen Tag, aber ich kann keine Antwort finden. Über meine Frage. Ich habe eine Abfrage an die Datenbank und ich möchte ein leeres Array überprüfen und ich zeige eine Nachricht über das im Abonnenten. Ja, ich kann das, aber ich denke, es gibt eine bessere Lösung. In dieser answer fand ich ähnliche Frage, aber dieser Operator funktioniert nicht für mich. Hier ist mein Code beobachtbarer und TeilnehmerWie überprüft man ein leeres Array in der Observablen?

private void getCategory(){ 
    observable = Observable.create(new Observable.OnSubscribe<PaginatedScanList<ProductDO>>() { 
     @Override 
     public void call(Subscriber<? super PaginatedScanList<ProductDO>> subscriber) { 
      final Map<String, AttributeValue> filterExpressionAttributeValues = new HashMap<>(); 
      filterExpressionAttributeValues 
        .put(":val1", new AttributeValue().withS(category)); 
      final DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() 
        .withFilterExpression("category = :val1") 
        .withExpressionAttributeValues(filterExpressionAttributeValues); 
      PaginatedScanList<ProductDO> result = dynamoDBMapper.scan(ProductDO.class, scanExpression); 
      Log.d(TAG, "response size is " + result.size()); 
      subscriber.onNext(result); 
      subscriber.onCompleted(); 
     } 
    }).switchIfEmpty(Observable.create(subscriber -> subscriber.onNext(null))); 
    subscriber = new Subscriber<ProductDO>() { 
     @Override 
     public void onCompleted() { 
      loadCategoryProduct.setVisibility(View.INVISIBLE); 
     } 

     @Override 
     public void onError(Throwable e) { 
      e.printStackTrace(); 
      Toast.makeText(getActivity(), "something went wrong, please restart app", Toast.LENGTH_SHORT).show(); 
      getActivity().onBackPressed(); 
     } 

     @Override 
     public void onNext(ProductDO productDO) { 
      if (productDO == null) 
       Toast.makeText(getActivity(), "No item in this category", Toast.LENGTH_SHORT).show(); 
      else { 
       productItem.add(productDO); 
       adapter.notifyDataSetChanged(); 
       Log.d(TAG, "result category " + productDO.getName()); 
      } 
     } 
    }; 
    observable 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .flatMap(product -> Observable.from(product)) 
      .subscribe(subscriber); 
} 

Bitte helfen Sie mir, ich weiß nicht, warum switchIfEmpty nicht oder vielleicht funktioniert ich etwas falsch mache. Danke im Voraus.

Antwort

2

Sie können nur filter Operator statt switchIfEmpty

.filter(result -> { 
    if(result.size() > 0){ 
     return true; 
    } else { 
     //Show your toast here 
     return false; 
    } 
}) 

switchIfEmpty nicht in der Art und Weise Sie vorgeschlagen funktioniert. Es hat keine Informationen darüber, dass es sich bei dem Objekt um eine Liste oder um eine Größe handelt. Das Wort "leer" im Namen des Bedieners stellt einen leeren Stream dar, was bedeutet, dass es Objekte aus der beobachtbaren Reserve (Ihre Nullemission) nur aussenden würde, wenn keine Emissionen und ein kompletter Aufruf aus dem ursprünglichen Stream vorhanden wären, nicht wenn die ausgegebene Liste leer war.

+0

Ouh, danke, wird es mir helfen) Sind Sie wissen, warum nicht meine Lösung arbeiten? –

+0

Ich habe meine Antwort bearbeitet, um besser zu erklären, warum Ihre Lösung nicht funktioniert hat. Wenn Sie das Problem gelöst haben, markieren Sie bitte die Antwort als angenommen, so dass andere wissen Sie nicht mehr Unterstützung – koperko

+0

Dank brauchen, werde ich Ihre Antwort als richtig –

Verwandte Themen