2017-11-21 2 views
0

Ich möchte eine einzige Gson Instanz schaffen, so dass ich schaffen es in meinem Network, wenn ich Retrofit api erstellen, ist Gson nicht null, aber wenn ich Gson Instanz in Retrofit-Klasse, es ist null ..Android Kotlin Dagger2 bieten Gson: Parameter als nicht-null angegeben ist null

@Module 
    class NetworkModule { 

     @Provides 
     @Singleton 
     fun provideGson(): Gson { 
      return Gson() 
     } 

     @Provides 
     @Singleton 
     fun provideMyEnterpriseApi(gson: Gson): MyEnterpriseApi { 

      //HERE GSON IS NOT NULL 

      return RetrofitMyEnterpriseApi(BuildConfig.API_MYENTERPRISE_URL, 
        BuildConfig.API_MYENTERPRISE_CONNECTION_TIMEOUT, 


     BuildConfig.API_MYENTERPRISE_READ_TIMEOUT, 
       gson) 
    } 
} 

Meine Retrofit api Klasse:

class RetrofitMyEnterpriseApi(baseUrl: String, connectTimeout: Long, readTimeout: Long, private val gson: Gson) 
    : RetrofitApi<RetrofitMyEnterpriseCalls>(baseUrl, connectTimeout, readTimeout, RetrofitMyEnterpriseCalls::class.java) { 

    override fun buildRetrofit(baseUrl: String, connectTimeout: Long, readTimeout: Long): Retrofit { 
     val builder = Retrofit.Builder() 

     builder.baseUrl(baseUrl) 
     builder.client(buildClient(connectTimeout, readTimeout)) 
     builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
     builder.addConverterFactory(GsonConverterFactory.create(gson)) 

     return builder.build() 
    } 

    private fun buildClient(connectTimeout: Long, readTimeout: Long): OkHttpClient { 

     //HERE GSON IS NULL 

     return OkHttpClient.Builder() 
       .addInterceptor(OAuth2Interceptor(gson, this)) 
       .addInterceptor(LoggingInterceptor.newInstance()) 
       .connectTimeout(connectTimeout, TimeUnit.MILLISECONDS) 
       .readTimeout(readTimeout, TimeUnit.MILLISECONDS) 
       .build() 
    } 
} 

RetrofitApi Klasse:

abstract class RetrofitApi<C> 
(baseUrl: String, connectTimeout: Long, readTimeout: Long, callsClass: Class<C>) { 

    protected val calls: C 

    init { 
     val retrofit = buildRetrofit(baseUrl, connectTimeout, readTimeout) 

     calls = retrofit.create(callsClass) 
    } 

    protected abstract fun buildRetrofit(baseUrl: String, connectTimeout: Long, readTimeout: Long): Retrofit 
} 

Also, wenn ich schaffen es nicht null ist, aber wenn ich es in buildClient Methode verwenden, ist null, ich kann nicht sehen, warum ich etwas in Kotlin verpassen vielleicht.

Antwort

1

Ich fand Antwort, wenn i \ geschrieben o/

So das Problem Gson Feld in RetrofitMyEnterpriseApi Klasse wird nach der init von RetrofitApi Elternklasse instancied wurde, ich denke, es ist seltsam, weil ich es in Parametern übergeben, aber ..

ich brauche nur meine buildRetrofit Methode nach init von RetrofitMyEnterpriseApi Klasse aufzurufen, oder senden Instanz meiner Elternklasse Gson.

Verwandte Themen