Неожиданная ошибка JDWP: 103. Исключение при вызове GET при модификации (2.3.0) - PullRequest
0 голосов
/ 14 октября 2018

Я получаю неожиданную ошибку 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"
}

Внутренний запрос:

enter image description here

Классы моделей:

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)
}

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Если кто-то все еще просматривает это сообщение - извините, я допустил ошибку.

Дооснащение работает правильно, проблема была в неинициализированном представлении в классе презентатора, поэтому, когда я вызывал метод apigroupApi.getGroups(GroupRequest(q).toMap()) в отладке - возникло исключение.Но проблема была в представлении класса.

0 голосов
/ 17 октября 2018

Вы пытались внедрить модификацию (вместо GroupApi) и затем вызвать
retrofit.create (GroupApi :: class.java) .getGroups (GroupRequest (q) .toMap ()) в вашем SearchResultInteractor?Также вы можете аннотировать интересную функцию provideRetrofit () как Singleton.

...