我正在嘗試使用 oKhttp 從 API 快取我的資料并將這些資料保存到 FILE 中。問題是當我嘗試applicationContext.cacheDir在我的NetworkLayer類中使用 , 但它給了我一個錯誤。
我試圖讓我的NetworkLayer從Application()擴展,但問題仍然存在。
我也試圖對這個問題進行一些搜索,但我沒有找到任何相關的東西。提前致謝。
這是我的代碼
網路層
class NetworkLayer : Application() {
private val BASE_URL = ""
private val moshi: Moshi = Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build()
private fun myHttpClient(): OkHttpClient {
val interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
val httpCacheDirectory = File(applicationContext.cacheDir, "http-cache")
val cacheSize = 10 * 1024 * 1024 // 10 MiB
val cache = Cache(httpCacheDirectory, cacheSize.toLong())
val builder = OkHttpClient()
.newBuilder()
.addNetworkInterceptor(CacheInterceptor())
.cache(cache)
.addInterceptor(interceptor)
.callTimeout(3, TimeUnit.SECONDS)
.connectTimeout(3, TimeUnit.SECONDS)
return builder.build()
}
private val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(myHttpClient())
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
val apiService: APIService by lazy {
retrofit.create(APIService::class.java)
}
}
問題就在這里,在這個代碼行
val httpCacheDirectory = File(applicationContext.cacheDir, "http-cache")
我的CacheInterceptor類
class CacheInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val response: Response = chain.proceed(chain.request())
val cacheControl = CacheControl.Builder()
.maxAge(1, TimeUnit.DAYS)
.build()
return response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
.header("Cache-Control", cacheControl.toString())
.build()
}
}
錯誤訊息_
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.moataz.afternoonhadeeth/com.moataz.afternoonhadeeth.ui.view.activity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3430)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3614)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199)
at android.os.Handler.dispatchMessage(Handler.java:112)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:116)
at com.moataz.afternoonhadeeth.data.request.NetworkLayer.myHttpClient(NetworkLayer.kt:26)
at com.moataz.afternoonhadeeth.data.request.NetworkLayer.<init>(NetworkLayer.kt:42)
at com.moataz.afternoonhadeeth.data.repository.ApiClient.<init>(ApiClient.kt:12)
at com.moataz.afternoonhadeeth.ui.viewmodel.HomeViewModel.<init>(HomeViewModel.kt:16)
at com.moataz.afternoonhadeeth.ui.view.fragment.HomeFragment.<init>(HomeFragment.kt:25)
at com.moataz.afternoonhadeeth.ui.view.activity.MainActivity.initializeBottomNavigation(MainActivity.kt:71)
at com.moataz.afternoonhadeeth.ui.view.activity.MainActivity.onCreate(MainActivity.kt:46)
at android.app.Activity.performCreate(Activity.java:7458)
at android.app.Activity.performCreate(Activity.java:7448)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1286)
編輯:這是最終代碼
class NetworkLayer : AppCompatActivity() {
private val BASE_URL = ""
private val moshi: Moshi = Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build()
private val myHttpClient = OkHttpClient()
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
val interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
val httpCacheDirectory = File(applicationContext.cacheDir, "http-cache")
val cacheSize = 10 * 1024 * 1024 // 10 MiB
val cache = Cache(httpCacheDirectory, cacheSize.toLong())
myHttpClient
.newBuilder()
.addNetworkInterceptor(CacheInterceptor())
.addInterceptor(ForceCacheInterceptor())
.cache(cache)
.callTimeout(3, TimeUnit.SECONDS)
.connectTimeout(3, TimeUnit.SECONDS)
.build()
}
private val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(myHttpClient)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
val apiService: APIService by lazy {
retrofit.create(APIService::class.java)
}
}
uj5u.com熱心網友回復:
applicationContext.cacheDir必須在課后 打電話。onCreate()Application
在您的代碼myHttpClient()中呼叫之前 也是onCreate()如此。applicationContextnull
要解決此問題,您可以retrofit在應用程式中創建onCreate()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/411480.html
標籤:
上一篇:SpannableString在多次使用時會丟失跨度
下一篇:java.lang.NullPointerException:mainRvRef不能為null,其中mainRvRef參考reyclerView
