2017-06-08 22 views
0

スタートアップ時にいくつかのJSONファイルを解析し、データをデータベースに取り込む必要があります。アプリケーションの起動時に、ファイルが解析されている間にスプラッシュ画面が表示されます。RxJavaを使用してメインスレッドからJSONを解析する

メインスレッドからすべての解析を実行し、アニメーションをスムーズに進めることができます。

RxJavaのObservable.create()メソッドを使用してObservableを作成することができました。現在のコードを以下に示します。

Observable.create(new Observable.OnSubscribe<Object>() { 
    @Override 
    public void call(Subscriber<? super Object> subscriber) { 
     parseBundles(); 
     parsePhrases(); 
    } 
}) 
.subscribeOn(Schedulers.io()) 
.subscribe(new Subscriber<Object>() { 
    @Override 
    public void onCompleted() { 
     startActivity(new Intent(SplashActivity.this, HomeActivity.class), 
      ActivityOptionsCompat.makeCustomAnimation(SplashActivity.this, 
      android.R.anim.fade_in, android.R.anim.fade_out).toBundle()); 
    } 

    @Override 
    public void onError(Throwable e) { 
     e.printStackTrace(); 
    } 

    @Override 
    public void onNext(Object o) { 

    } 
}); 

これが正常IOスレッドで実行parseBundles()parsePhrases()方法になります。状況によっては、これらの2つの方法では、ローカル.jsonファイルをInputStreamでロードし、.jsonString変数にスローすると、該当するJSONObjectsが取り出され、データがDBに保存されます。

ただし、onCompleted()は呼び出されません。 parseBundles()parsePhrases()の両方の方法は、Rxコードを使用しない単純な古い方法です。私が理解しているように、完成すると何かを適切に放出するように修正する必要があります。

このコードを説明どおりに動作させるにはどうすればよいですか?これは現在RxJava 1を使って書かれていますが、RxJava 2を使った回答も受け入れられることに注意してください。

答えて

1

観測が適切に構築されていないあなた、あなたは非同期プロセスを自分で運転する必要があります。

Observable.create(new Observable.OnSubscribe<Object>() { 
    @Override 
    public void call(Subscriber<? super Object> subscriber) { 
    parseBundles(); 
    parsePhrases(); 
    subscriber.onCompleted(); 
    } 
}) 

さておき、私はObservable.createを憎むとして - それはあまりにも低レベルだとあまりにも多くの人々はそれが間違って最初に取得します2〜3回;なぜチュートリアルがそれから始まるのか理解できませんでした。

+0

ありがとう、私はそれがとてもシンプルなものであることを認識しませんでした。 'Observable.from()'、 'Observable.just()'、および他の同様のメソッドを使用して作成されたObservablesを作成および使用することは、かなり簡単です。しかし、私は同意します。カスタムメソッドをラップするときに、 'Observable.create()'が必要であり、直感的ではありません。 – Orbit

+1

'Observable.fromCallable'または' Observable.from(Future ) ' –

+0

' .fromCallable() 'が便利に見えるので、私はそれを調べます。また、RxJava 2の 'Observable.create()'を使ってこの機能をどのように実装するのか知っていますか? 'ObservableOnSubscribe ()'をとり、 'ObservableEmitter e'を渡す' subscribe() 'メソッドを含んでいます。単にメソッドを呼び出して 'e.onComplete() 'を呼び出すだけの問題でしょうか? – Orbit

関連する問題