2016-10-18 18 views
1

Я использую Retrofit с RxJAva для приложения, которое получает Rss-каналы, но rss не содержит всю информацию, поэтому я использую jsoup для разбора каждого элемента ссылки, чтобы получить изображение и описание статьи. теперь я использую его таким образом:Запросы на привязку андроида RxJava

public Observable<Rss> getDumpData() { 
    System.out.println("in the getDumpData"); 
    if (newsAppService == null) { 
     System.out.println("newsAppServer is null"); 
    } 
    return newsAppService.getDumpData() 
      .flatMap(new Func1<Rss, Observable<Rss>>() { 
       @Override 
       public Observable<Rss> call(Rss rss) { 
        List<Item> items = new ArrayList<Item>(); 
        for (int i = 0; i < rss.channel.items.size(); i++) { 
         Document document = null; 
         try { 
          document = Jsoup.connect(rss.channel.items.get(i).link).get(); 
          Element element = document.select("div[itemprop=image] > img").first(); 
          Element bodyElement = document.select("div[class=articlebody]").first(); 
          System.out.println("got element " +bodyElement.toString()); 
          rss.channel.items.get(i).image = element.attr("src"); 
          items.add(rss.channel.items.get(i)); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 

        } 
        rss.channel.items = items; 
        rss.version = "Mams :D"; 
        return Observable.just(rss); 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()); 
} 

это чистый? Есть ли способ лучше ?

+0

Пожалуйста, не публикуйте скриншоты, ваш код может быть скопирован здесь гораздо проще, чем изображение, и вы получите лучшие ответы. –

+0

спасибо @TassosBassoukos, я только что обновил свой пост. – Mamadou

ответ

1

Давайте посмотрим ...

public Observable<Rss> getDumpData() { 
    System.out.println("in the getDumpData"); 
    if (newsAppService == null) { 
    System.out.println("newsAppServer is null"); 
    } 
    return newsAppService.getDumpData() 
    .flatMap(rss -> Observable 
     .from(rss.channel.items) 
     .observeOn(Schedulers.io()) 
     .flatMap(Checked.f1(item -> Observable 
     .just(Jsoup.connect(item.link).get()) 
     .map(document -> document.select("div[itemprop=image] > img").first()) 
     .doOnNext(element -> item.image=element.attr("src")) 
     )) 
    ) 
     .ignoreElements() 
     .defaultIfEmpty(rss) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()); 
} 

Класс проверил из rxJava-статистов, но вы можете написать один по своему усмотрению легко. И да, Java 8 действительно помогает с Rx; вышесказанное сделает все вызовы в сети одновременно.

+0

Привет, @ Tassos Я просто попробовал и его работы, я посмотрю на Java 8. – Mamadou

+0

Привет @TassosBassoukos после интеграции у меня все еще есть некоторые ошибки: – Mamadou