Kotlin 意外的JDWP错误:103。改装期间出现异常(2.3.0)获取呼叫

Kotlin 意外的JDWP错误:103。改装期间出现异常(2.3.0)获取呼叫,kotlin,retrofit2,dagger-2,Kotlin,Retrofit2,Dagger 2,我在调用vk.api获取一些数据时遇到意外的JDWP错误:103 我发现了相关的问题,但来自那里的建议已经应用到我的申请中 那么也许我的改装配置是错误的 下面是一些代码: DI模块,使用匕首 @Module class NetworkModule { @Provides internal fun provideRetrofit(): Retrofit { return Retrofit.Builder() .baseUrl(Api

我在调用vk.api获取一些数据时遇到意外的JDWP错误:103

我发现了相关的问题,但来自那里的建议已经应用到我的申请中

那么也许我的改装配置是错误的

下面是一些代码:

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 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>>>
}
片段的模块:

@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)
}
包含内部片段的注入程序的活动:

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
}
应用组件:

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

您是否尝试过注入改型(而不是GroupApi),然后调用
create(GroupApi::class.java).getGroups(GroupRequest(q).toMap())
在您的SearchResultTerractor中?还可以将fun provideRetrofit()注释为Singleton

如果有人还在看这篇文章,对不起,我搞错了


改装工作正常,问题出现在presenter类的未初始化视图中,因此当我在调试中调用api方法
groupApi.getGroups(GroupRequest(q).toMap())
时,出现异常。但问题出在view类中。

您是否也可以发布如何使用改装发送异步网络调用。@keshavAggarwal我已经发布了它,但我认为无论我如何调用它,因为我正在调试模式下测试它。我只是调用
groupApi.getGroups(GroupRequest(q).toMap())
进行测试,我得到了这个错误。尝试groupApi的构造函数注入,您正在
类SearchResultInteractor
中注入它,但您没有指定注入它的组件。@keshavAggarwal我提供了整个代码示例。(补充)。请您解释一下我必须在
类SearchResultTerractor
@keshavAggarwal的构造函数内部写些什么,您的意思是我必须像这样写:
类SearchResultTerractor@Inject构造函数(val groupApi:groupApi)
类似的内容?您是否为Dagger模块创建了一个组件,并在某个地方对其进行了初始化?我已经提供了整个代码示例,我正在应用DI。你能检查一下吗?我还是看不懂你的依赖关系图。应该有一个组件,其中包括您的networkModule(经过改装的模块),以及将视图(片段和活动)绑定到正在使用的模块的所有模块(在您的情况下是SearchResultFragmentProvider和类似的模块,它们仍然是模块,而不是提供程序)。然后必须在应用程序类中初始化此组件,即appComponent=DaggerYourAppComponent.builder().application(this.build();appComponent.inject(这个);很抱歉,我没有提供应用程序组件类,请在提供的代码末尾找到它。
@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
}
@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)
}