Kotlin 意外的JDWP错误:103。改装期间出现异常(2.3.0)获取呼叫
我在调用vk.api获取一些数据时遇到意外的JDWP错误:103 我发现了相关的问题,但来自那里的建议已经应用到我的申请中 那么也许我的改装配置是错误的 下面是一些代码: DI模块,使用匕首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
@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)
}