Я получаю неожиданную ошибку JDWP: 103 во время вызова vk.api для получения некоторых данных.
Я обнаружил эту тему с соответствующей проблемой, но предложение оттуда уже примененов моем приложении.
Так, может быть, моя конфигурация модифицирована неправильно?
Вот код:
Модуль для DI, использующий кинжал
@Module
class NetworkModule {
@Provides
internal fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl(ApiConstants.VK_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}
@Provides
internal fun provideGroupApi(retrofit: Retrofit) : GroupApi {
return retrofit.create(GroupApi::class.java)
}
}
Apiинтерфейс:
interface GroupApi {
@GET(ApiMethods.SEARCH_GROUPS)
fun getGroups(@QueryMap map: Map<String, String?>) : Observable<GroupResponse>
}
object ApiMethods {
const val SEARCH_GROUPS = "groups.search"
}
Внутренний запрос:
Классы моделей:
data class Response<T>(
val count: Int,
val items: List<T>
)
data class GroupResponse(
@SerializedName("response")
@Expose
val response: Response<Group>
)
data class Group(
@SerializedName("id")
@Expose
val id: Int,
@SerializedName("name")
@Expose
val name: String,
@SerializedName("screenName")
@Expose
val screen_name: String,
@SerializedName("isClosed")
@Expose
val is_closed: Int,
@SerializedName("type")
@Expose
val type: String,
@SerializedName("isAdmin")
@Expose
val is_admin: Int,
@SerializedName("isMebmer")
@Expose
val is_member: Int,
@SerializedName("photo_50")
@Expose
val photo_50: String,
@SerializedName("photo_100")
@Expose
val photo_100: String,
@SerializedName("photo_200")
@Expose
val photo_200: String
)
Вот ответпример от vk.api (я предоставляю это, потому что у меня есть мысль, что моя модель настроена не правильно):
{
"response": {
"count": 193738,
"items": [{
"id": 26667550,
"name": "ARTY",
"screen_name": "arty_music",
"is_closed": 0,
"type": "page",
"is_admin": 0,
"is_member": 0,
"photo_50": "https://pp.vk.me/...841/1B4wTxXinAc.jpg",
"photo_100": "https://pp.vk.me/...840/Xc_3PikLQ_M.jpg",
"photo_200": "https://pp.vk.me/...83e/kGwRLtSLJOU.jpg"
}, {
"id": 25597207,
"name": "Alexander Popov",
"screen_name": "popov.music",
"is_closed": 0,
"type": "page",
"is_admin": 0,
"is_member": 0,
"photo_50": "https://pp.vk.me/...e8f/g2Z9jU6qXVk.jpg",
"photo_100": "https://pp.vk.me/...e8e/DtYBYKLU810.jpg",
"photo_200": "https://pp.vk.me/...e8d/QRVqdhTvQ4w.jpg"
}, {
"id": 42440233,
"name": "Музыка",
"screen_name": "exp.music",
"is_closed": 0,
"type": "page",
"is_admin": 0,
"is_member": 0,
"photo_50": "https://pp.vk.me/...2d1/52gY6m5ZObg.jpg",
"photo_100": "https://pp.vk.me/...2d0/Jx9DWph_3ag.jpg",
"photo_200": "https://pp.vk.me/...2ce/qsFhk6yEtDc.jpg"
}]
}
}
Может ли кто-нибудь предложить какие-либо предложения?
ОБНОВЛЕНИЕ:
Я также попробовал другую модель ответа как:
data class Root<T> (
@SerializedName("response")
@Expose
val response: T
)
interface GroupApi {
@GET(ApiMethods.SEARCH_GROUPS)
fun getGroups(@QueryMap map: Map<String, String?>) : Observable<Root<Response<Group>>>
}
но все же не повезло ...
дополнительный код:
Ведущий, где я вызываю интерактор ->, а внутри интерактора я звоню GroupApi:
class SearchResultPresenter<V : SearchResultMVPView, I : SearchResultMVPInteractor> @Inject constructor(interactor: I, schedulerProvider: SchedulerProvider, compositeDisposable: CompositeDisposable)
: BasePresenter<V, I>(interactor = interactor, schedulerProvider = schedulerProvider, compositeDisposable = compositeDisposable), SearchResultMVPPresenter<V, I> {
override fun searchGroups(q: String) {
getView()?.showProgress()
interactor?.let {
compositeDisposable.add(it.getGroupList(q)
.compose(schedulerProvider.ioToMainObservableScheduler())
.subscribe { groupResponse ->
getView()?.let {
it.showSearchResult(groupResponse.response.items)
it.hideProgress()
}
})
}
}
}
class SearchResultInteractor @Inject constructor() : SearchResultMVPInteractor {
@Inject
lateinit var groupApi: GroupApi
override fun getGroupList(q: String): Observable<Root<Response<Group>>> = groupApi.getGroups(GroupRequest(q).toMap())
}
Я решил предоставить комуЛе-код, где я применяю DI:
@Singleton
@Component(modules = [(AndroidInjectionModule::class), (AppModule::class), (ActivityBuilder::class)])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
fun inject(app: MyApplication)
}
Модуль для фрагмента:
@Module
class SearchResultFragmentModule {
@Provides
internal fun provideSearchResultInteractor(interactor: SearchResultInteractor): SearchResultMVPInteractor = interactor
@Provides
internal fun provideSearchResultFragment(presenter: SearchResultPresenter<SearchResultMVPView, SearchResultMVPInteractor>)
: SearchResultMVPPresenter<SearchResultMVPView, SearchResultMVPInteractor> = presenter
@Provides
internal fun provideSearchResultProvider(): SearchResultAdapter = SearchResultAdapter(ArrayList())
@Provides
internal fun provideLayoutManager(fragment: SearchResultFragment) : LinearLayoutManager = LinearLayoutManager(fragment.activity)
}
Поставщик:
@Module
abstract class SearchResultFragmentProvider {
@ContributesAndroidInjector(modules = [(SearchResultFragmentModule::class), (NetworkModule::class)])
internal abstract fun proviceSearchResultFragmentModule(): SearchResultFragment
}
Деятельность, которая содержит инжектор для фрагментов внутриэто:
class MainActivity : BaseActivity(), MainMVPView, HasSupportFragmentInjector {
@Inject
internal lateinit var presenter: MainMVPPresenter<MainMVPView, MainMVPInteractor>
@Inject
internal lateinit var fragmentDispatchingAndroidInjector: DispatchingAndroidInjector<Fragment>
...
//some code
override fun supportFragmentInjector(): AndroidInjector<Fragment> = fragmentDispatchingAndroidInjector
}
И компоновщик активности:
@Module
abstract class ActivityBuilder {
@ContributesAndroidInjector(modules = [(MainActivityModule::class), (SearchResultFragmentProvider::class)])
abstract fun bindMainActibity(): MainActivity
}
AppComponent:
@Singleton
@Component(modules = [(AndroidInjectionModule::class), (AppModule::class), (ActivityBuilder::class)])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
fun inject(app: MyApplication)
}