如何从rxJava中提取并将其放在领域脱机数据库中?

时间:2016-10-24 17:13:33

标签: android realm rx-java retrofit2

我需要下载30k机场的长列表并将其放在离线数据库中。

我制作了这段代码来从网上下载json:

var filteredList = available.Where(a => !selected.Any(s => s.Id == a.Id))
                            .ToList();

并且效果很好,但如果我只想提取一个对象,比如map或flatMap,它会给我这个:

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

                        }
                    });

        }
    });

错误:

  

无法解析方法&#39;订阅(匿名   rx.Subscriber&GT)

这样:

  1. 我要做什么来解决它?我的问题是我不太了解rX而且我也有点困惑
  2. 我可以将数据放在realm数据库中的map()方法中(如果有效)?
  3. 谢谢

2 个答案:

答案 0 :(得分:3)

由于您要从List<Airport>映射到Airport,因此需要Subscriber<Airport>代替Subscriber<List<Airport>>,同时对onNext进行相同的更改import csv import re from tempfile import NamedTemporaryFile import shutil csvName = raw_input("Enter the filename: ") tempfile = NamedTemporaryFile(delete=False) newSize = 0 newArea = 0 with open(csvName, 'rb') as readCSV, tempfile: reader = csv.reader(readCSV) writer = csv.writer(tempfile) for row in reader: for col in row: if col.startswith('Connection:'): print col if col.startswith('Size:'): print "Current", col newSize = raw_input("Enter new size: ") newArea = int(newSize)*int(newSize) col = re.sub('[0-9]+', newSize, col) writer.writerow(row) if col.startswith('Area:'): col = re.sub('[0-9]+', str(newArea), col) writer.writerow(row) writer.writerow(row) shutil.move(tempfile.name, csvName) 方法。

答案 1 :(得分:0)

看起来像是用Java8和RxJava2-RC5编译的。我将订阅者参数从List更改为X,将onNext方法从List更改为X.也许您可以在您的环境中提供更多的intel。请注意,在RxJava2中不再可以返回null。

另外请注意,使用newThread-Scheduler不是一个好主意。

  

此调度程序每次请求时都会启动一个新线程   通过订阅beOn()或observeOn()。 newThread()几乎不是一件好事   选择,不仅仅是因为启动时涉及的延迟   线程,也因为这个线程没有被重用。 --Tomaz Nurkiewicz来自&#34;使用RxJava进行反应性编程&#34;

使用RxJava2-RC5的示例-Impl

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

                    }
                });