2016-10-24 6 views
0

30k空港の長いリストをダウンロードし、オフラインデータベースに置く必要があります。rxJavaから抽出してrealmオフラインデータベースに置く方法は?

私はウェブからJSONをダウンロードするには、このコードを作った:

bFetch.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) 
     { 
      Retrofit retrofit = new Retrofit.Builder() 
        .addConverterFactory(GsonConverterFactory.create()) 
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
        .baseUrl(GithubService.SERVICE_ENDPOINT).build(); 

      GithubService service = retrofit.create(GithubService.class); 

      service.getAirport() 
        .subscribeOn(Schedulers.newThread()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Subscriber<List<Airport>>() { 
         @Override 
         public void onCompleted() 
         { 
         bClear.setText("OK"); 
         } 

         @Override 
         public void onError(Throwable e) { 

         } 

         @Override 
         public void onNext(List<Airport> airports) 
         { 
         Log.d("msh",String.valueOf(airports.size())); 

         } 
        }); 

     } 
    }); 

と、それは非常にうまく動作しますが、私は1つのオブジェクトのみを抽出したい場合は、マップやflatMapのように、それは私にこれを与えます:そう

Cannot resolve method 'subscribe(anonymous rx.Subscriber>)

:エラーと

service.getAirport() 
        .map(new Func1<List<Airport>, Airport>() 
        { 
         @Override 
         public Airport call(List<Airport> airports) { 
          return null; 
         } 
        }) 
        .subscribeOn(Schedulers.newThread()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Subscriber<List<Airport>>() { 
         @Override 
         public void onCompleted() 
         { 
         bClear.setText("OK"); 
         } 

         @Override 
         public void onError(Throwable e) { 

         } 

         @Override 
         public void onNext(List<Airport> airports) 
         { 
         Log.d("msh",String.valueOf(airports.size())); 

         } 
        }); 

     } 
    }); 

  1. 私はそれを解決するために何をしなければなりませんか?私の問題は、私は非常によくrXを理解していないと私は少し混乱があることです
  2. 私はマップ()メソッド(もしあれば)の領域データベースにデータを置くことができますか?

あなたはList<Airport>からAirportにマッピングしているので、あなたがonNextメソッドに同じ変化に伴って、代わりにSubscriber<List<Airport>>Subscriber<Airport>を持っている必要がありますあなたに

+1

http://stackoverflow.com/documentation/android/3187/realm/14393/using-realm-with-rxjava#t=201608051116154137207 – EpicPandaForce

+0

@EpicPandaForce私は別のサブスクリプションを行う方法を理解していません。 – nani

+0

どこからレルムのデータを使用していますか – EpicPandaForce

答えて

3

ありがとうございます。

+0

これを行うと思っていましたが、それはエラーです。おそらく、マップの実装に使用されました – nani

0

Java8とRxJava2-RC5でコンパイルするようです。私はサブスクライバのパラメータをListからXに、onNextメソッドをListからXに変更しました。おそらくあなたの環境にもっと詳しい情報を提供することができます。 RxJava2ではnullを返すことができなくなることに注意してください。

さらに、newThread-Schedulerを使用することはお勧めできません。

This scheduler simply starts a new thread every time it is requested via subscri beOn() or observeOn() . newThread() is hardly ever a good choice, not only because of the latency involved when starting a thread, but also because this thread is not reused. --Tomasz Nurkiewicz from "Reactive Programming with RxJava"

例-ImplをRxJava2-RC5と

Observable.just(Arrays.asList("1", "2", "3")) 
       .map(new Function<List<String>, String>() { 
        @Override 
        public String apply(List<String> s) throws Exception { 
         return null; 
        } 
       }).subscribeOn(Schedulers.newThread()) 
       .subscribe(new Observer<String>() { 
        @Override 
        public void onSubscribe(Disposable d) { 

        } 

        @Override 
        public void onNext(String value) { 

        } 

        @Override 
        public void onError(Throwable e) { 

        } 

        @Override 
        public void onComplete() { 

        } 
       }); 
関連する問題