0

Use implementation 'io.reactivex.rxjava2:rxjava:2.1.9'

I am trying parsing withe rxJava. Parse long json data. So my parse take time. But if user leave screen my parsing need finish work but instead my app crashes. Method for parsing:

    override fun restore(): Observable<List<Pair<String, String>?>> {
return backupRemoteSource.getBackup()
                .flatMap { urlBackup ->
                    Observable.create<Boolean> { emitter ->
                        var isRestore = true
                        try {
                            val url = URL(urlBackup)
                            url.openConnection()
                            InputStreamReader(url.openStream(), "UTF-8").use {
                                val jsonReader = JsonReader(it)

                                jsonReader.beginArray()

                                var tour: Tour? = null

                                /* tours */
                                while (jsonReader.hasNext() ) {

                                    /* tour item*/
                                    jsonReader.beginObject()
                                    while (jsonReader.hasNext() && isRestore) {

                                        val name = jsonReader.nextName()

                                        when (name) {

                                            "tourInfo" -> {

                                                tour = tourMapper.fromRx(gsonParser.fromJson<TourBackup>(jsonReader, TourBackup::class.java))
                                                        .flatMap {


                                                            tourLocalSource.save(it)
                                                        }.blockingFirst()

                                                Log.i(tag, "\n@saved tour")
                                            }

                                      jsonReader.endArray()
                                            }
                                        }

                                    }
                                    jsonReader.endObject()
                                }
                                jsonReader.endArray()

                                emitter.onNext(true)
                            }
                        } catch (error: InterruptedException) {
                            emitter.onError(BackupException(error.message ?: "unknown exception"))
                        } catch (error: NoSuchFileException) {
                            emitter.onError(BackupException(error.message ?: "unknown exception"))
                        } catch (error: IOException) {
                            emitter.onError(BackupException(error.message ?: "unknown exception"))
                        }

                        emitter.setCancellable({
                            Log.d(tag,"cancel restore")
                            isRestore = false
                        })
                    }

                }
....}

then i call:

fun restore() {

    disposables.add(backUpRepo.restore()
            .compose(RxUtils.ioToMainTransformer())
            .subscribe()
}

but when calling during long data parsing:

disposables.dispose()

i get crash:

  04-23 14:57:27.456 28001-28063/com.jellyworkz.udark.debug E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-1
    Process: com.jellyworkz.udark.debug, PID: 28001
    io.reactivex.exceptions.UndeliverableException: java.lang.RuntimeException: java.lang.InterruptedException


....

    Caused by: java.lang.RuntimeException: java.lang.InterruptedException
        at io.reactivex.internal.util.ExceptionHelper.wrapOrThrow(ExceptionHelper.java:45)
        at io.reactivex.internal.observers.BlockingBaseObserver.blockingGet(BlockingBaseObserver.java:74)
        at io.reactivex.Observable.blockingFirst(Observable.java:4987)
        at com.jellyworkz.udark.backup.source.BackupRepositoryImpl$restore$1$1.subscribe(BackupRepositoryImpl.kt:113)

Where do i wrong?

ColdFire
  • 6,764
  • 6
  • 35
  • 51
Serg Burlaka
  • 2,351
  • 24
  • 35

1 Answers1

3

Just used emitter.tryOnError

   try{

    ....

    } catch (error: InterruptedException) {
         emitter.tryOnError(BackupException(error.message ?: "unknown exception"))
    }

see more details

Serg Burlaka
  • 2,351
  • 24
  • 35