2016-10-24 24 views
0

我需要下載一個長長的30k機場列表並將其放置在離線數據庫中。如何從rxJava中提取並將其置於離線數據庫領域?

我做了這個代碼,從網絡上下載的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())); 

         } 
        }); 

     } 
    }); 

,它工作得非常好,但如果我想提取了一個對象,像地圖或flatMap,它給了我這樣的:

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())); 

         } 
        }); 

     } 
    }); 

與錯誤:

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

這樣:

  1. 我要做些什麼來解決它?我的問題是,我不明白rX,我也有點困惑
  2. 我可以把數據放在領域數據庫在map()方法(如果它的工作)?

謝謝

+1

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

+0

@EpicPandaForce我不明白如何做另一個訂閱,並在哪裏 – nani

+0

那麼你在哪裏使用的數據從領域 – EpicPandaForce

回答

3

既然你從List<Airport>映射到Airport,你需要有一個Subscriber<Airport>代替Subscriber<List<Airport>>,用相同的變化到onNext方法一起。

+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() { 

        } 
       }); 
相關問題