android -java.io.IOException: отменяется при утилизации - PullRequest
3 голосов
/ 02 мая 2019

Я использую компонент архитектуры Android, rxjava и модернизацию со структурой mvvm, кстати, я новичок в этих областях

Проблема, с которой я столкнулся, заключается в том, что я избавился от своих одноразовых принадлежностей в viewmodel, проблема в том, что это сработает, когда я перейду с активности на активность или закрою приложение, и не будет перезапущено снова, когда оно возобновляет действие, поэтому я потерял соединение и получаю сообщение FAILED: java.io.IOException: ошибка отменена, когда я хочу снова использовать соединение API.

Это мой код:

class CategoryViewModel(private val model:CategoryModel): ViewModel() {

private lateinit var catsLiveData:MutableLiveData<MutableList<Cat>>

fun getCats():MutableLiveData<MutableList<Cat>>{
    if(!::catsLiveData.isInitialized){
        catsLiveData=model.getCats()
    }
    return catsLiveData;
}

override fun onCleared() {
    super.onCleared()
    model.clearDisposable()
}

Это мой модельный класс, где я получаю данные из интернета:

class CategoryModel(
    private val netManager: NetManager,
    private val sharedPrefManager: SharedPrefManager) {

private lateinit var categoryDao: CategoryDao
private lateinit var dbConnection: DbConnection
private lateinit var lastUpdate: LastUpdate
private var list: MutableLiveData<MutableList<Cat>> = MutableLiveData()
public val compositeDisposable= CompositeDisposable()

fun getCats(): MutableLiveData<MutableList<Cat>> {

        return getCatsOnline();


}

private fun getCatsOnline(): MutableLiveData<MutableList<Cat>> {
    Log.v("this", "online ");
    val getCats = ApiConnection.client.create(Category::class.java)
    compositeDisposable+=getCats.getCats(sharedPrefManager.getUid(), lastUpdate.getLastCatDate())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    { success ->
                        list += success.cats

                    }, { error ->
                Log.v("this", "ErrorGetCats " + error.localizedMessage);
            }
            )

    return list;
}


fun clearDisposable(){
    if(!compositeDisposable.isDisposed){
        compositeDisposable.dispose()
        Log.v("this","disposable called");
    }
}
}

Что не так с этим?

1 Ответ

0 голосов
/ 06 мая 2019

Уничтожение композита заставит его распоряжаться каждым будущим Disposable добавленным к нему. Измените его на clear, и вы сможете использовать то же самое CompositeDisposable.

fun clearDisposable(){
    compositeDisposable.clear()
    Log.v("this","disposable called");
}
...