когда я пытаюсь вызвать saveEvent в EventViewModel.kt, всегда получаю onRetrievePostListSuccess (результат) и никогда не ошибаюсь, но запись никогда не вставляется в базу данных (ранее я проверял APi event / insertEvent от Postman и работал хорошо).Почему я не ошибся?Также, когда я попытался позвонить val response = eventApi.insertEvent("name","place")
, я получил неожиданную ошибку JDWP: 103
Что я делаю неправильно?
Я использую инъекцию Dagger2
Я видел подобную проблему в stackoverflow, но кто-то просто забыл о addCallAdapterFactory.
Мои файлы ниже:
EventViewModel.kt
class EventViewModel : BaseViewModel() {
@Inject
lateinit var eventApi: EventApi
val errorMessage: MutableLiveData<String> = MutableLiveData()
override fun onCleared() {
super.onCleared()
subscription.dispose()
}
private lateinit var subscription: Disposable
fun saveEvent(){
subscription = Single.just { eventApi.insertEvent("name","place") }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe {
onRetrievePostListStart(it) }
.doOnTerminate {onRetrievePostListFinish() }
.subscribe(
{ result -> onRetrievePostListSuccess(result) },
{ error -> onRetrievePostListError(error) }
)
}
ViewModelInjector.kt
@Singleton
@Component(modules = [(NetworkModule::class)])
interface ViewModelInjector {
fun inject(eventViewModel: EventViewModel)
@Component.Builder
interface Builder {
fun build(): ViewModelInjector
fun networkModule(networkModule: NetworkModule): Builder
}
}
NetworkModule.kt
@Module
@Suppress("unused")
object NetworkModule {
@Provides
@Reusable
@JvmStatic
internal fun provideEventApi(retrofit: Retrofit): EventApi {
return retrofit.create(EventApi::class.java)
}
@Provides
@Reusable
@JvmStatic
internal fun provideRetrofitInterface(): Retrofit {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.build()
}
}
BaseViewModel.kt
abstract class BaseViewModel:ViewModel(){
private val injector: ViewModelInjector = DaggerViewModelInjector
.builder()
.networkModule(NetworkModule)
.build()
init {
inject()
}
/**
* Injects the required dependencies
*/
private fun inject() {
when (this) {
is EventViewModel -> injector.inject(this)
}
}
}
EventApi.kt
interface EventApi{
@FormUrlEncoded
@POST("v1/event/insertEvent")
fun insertEvent(@Field("name") name: String, @Field("place") place: String) : Single<ErrorResponse>
}
ViewModelFactory.kt
class ViewModelFactory(private val activity: Activity): ViewModelProvider.Factory{
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if(modelClass.isAssignableFrom(EventViewModel::class.java)){
val key = "EventViewModel"
if(hashMapViewModel.containsKey(key)){
return getViewModel(key) as T
} else {
addViewModel(key, EventViewModel())
return getViewModel(key) as T
}
}
throw IllegalArgumentException("Unknown ViewModel class")
}
companion object {
val hashMapViewModel = HashMap<String, ViewModel>()
fun addViewModel(key: String, viewModel: ViewModel){
hashMapViewModel.put(key, viewModel)
}
fun getViewModel(key: String): ViewModel? {
return hashMapViewModel[key]
}
}
}