2016-05-06 3 views
2

私は次のコードを持っています。それは基本的にDynamoDBのに特定のSQLiteのテーブルからすべてのデータを送信しようとする試みです:doOnErrorは実装されていますが、RxAndroidはアプリケーションをクラッシュさせます

Observable.create(new Observable.OnSubscribe<Area>() { 
    @Override 
    public void call(Subscriber<? super Area> subscriber) { 
     try { 
      for (Area item : areaDao.listAll()) { 
       subscriber.onNext(item); 
      } 
      subscriber.onCompleted(); 
     } catch (Exception e) { 
      subscriber.onError(e); 
     } 
    } 
}).flatMap(new Func1<Area, Observable<Area>>() { 
    @Override 
    public Observable<Area> call(Area area) { 
     dynamoDBMapper.save(area); 
     return Observable.just(area); 
    } 
}).observeOn(
     AndroidSchedulers.mainThread() 
).doOnError(new Action1<Throwable>() { 
    @Override 
    public void call(Throwable throwable) { 
     Log.w("AreaHandler", "Could not upload area", throwable); 
    } 
}).doOnCompleted(new Action0() { 
    @Override 
    public void call() { 
     Toast.makeText(ctx, R.string.toast_upload_successful, Toast.LENGTH_SHORT).show(); 
    } 
}).subscribeOn(
     Schedulers.io() 
).subscribe(new Action1<Area>() { 
    @Override 
    public void call(Area area) { 
     areaDao.delete(area.getId()); 
    } 
}); 

Iが無効にインターネット接続とエミュレータ上でそれを実行しようとしている、と何が起こるかは、ダイナモクライアントはのカップルを行うということです(失敗した)再試行では、例外がスローされ、アプリケーションがクラッシュします。私がドキュメントで読んだことから、例外は野生に送られてプロセスを殺すのではなく、doOnErrorによって飲み込まれるべきです。

私には何が欠けていますか?

答えて

2

間違った場所でエラーを検出しています。 doOnErrorは副作用です。エラーを処理しません。 2アクション1で

オプション1パス

Observable.just(1, 2, 3) 
      .subscribe(
        new Action1<Integer>() { 
         @Override 
         public void call(Integer integer) { 
          System.out.println(integer); 
         } 
        }, 
        new Action1<Throwable>() { 
         @Override 
         public void call(Throwable throwable) { 
          System.err.print(throwable); 
         } 
        }); 

オプション2:オブザーバーに渡し

Observable.just(1, 2, 3) 
      .subscribe(new Observer<Integer>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 
        System.err.print(throwable); 
       } 

       @Override 
       public void onNext(Integer integer) { 
        System.out.println(integer); 
       } 
      }); 
関連する問題