Coroutine никогда не вызывает API после отмены или ожидания задания - PullRequest
0 голосов
/ 14 февраля 2020

Как сделать вызовы, когда я нажимаю кнопку loan1 после получения исключения JobCancellationException для других вызовов?

class MainRepository{

   //called many times
   suspend fun getLoanOptions(): Resource<LoanOptionsResponse> {
        return try {
            val response = apiService.getLoanOptions("id")
            responseHandler.handleSuccess(response)
        } catch (e: Exception) {
            responseHandler.handleException(e)
        }
    }
}
class MainViewModel : ViewModel(), CoroutineScope {

    private val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
        Timber.e("$throwable")
    }

    override val coroutineContext: CoroutineContext
        get() = Dispatchers.IO + SupervisorJob() + exceptionHandler

    private val mainRepo: MainRepository by lazy { MainRepository() }

    //extra calls to this fails 
    fun getLoanOptions(): LiveData<Resource<LoanOptionsResponse>> {
        return liveData(coroutineContext) {
            val data = mainRepo.getLoanOptions()
            emit(Resource.loading(null))
            emit(data)

        }
    }

   override fun onCleared() {
        super.onCleared()
        coroutineContext.cancel()
    }

}
 //in mainactivity I call it

 class MainActivity : BaseActivity() {

 val vm: MainViewModel by lazy { ViewModelProvider(this).get(MainViewModel::class.java)  }

   override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_main)

      loan1.setOnClickListener {
         // if any previous api has 403 this one does not work any more ?
         vm.getLoanOptions().observe(this, Observer {
           //data
         }
      }

      loan2.setOnClickListener {

      }

    }
 }


Я нажал на кнопку -> Api вызывается -> получил ответ об успехе

Снова я нажал -> Api вызывается -> получил ответ об успехе

Я получаю 403 в другом вызове API

Я нажал на кнопку -> Api не вызывается

Никакие другие вызовы API не вызываются в этом действии: (*

Я получаю это через несколько минут

kotlinx.coroutines.JobCancellationException: Job was cancelled; job=StandaloneCoroutine
...