【Kotlin/Android Studio】WebViewでHTTPエラーハンドリングの実装方法!
この記事からわかること
- Kotlin/Android StudioでWebViewの使い方
- WebViewClientのonReceivedErrorメソッド
- HTTPエラーを取得する方法
- エラーハンドリングの方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献:公式リファレンス:WebView でのウェブアプリの作成
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
WebViewでHTTPエラーを取得する方法
AndroidのWebViewでHTTPエラーを取得するにはWebViewClient
のonReceivedHttpError
メソッドを使用します。WebViewClient
はWebView
を制御するためのクラスでアプリ内での遷移やHTTPエラーハンドリングなどが可能になっています。
まずはWebViewClient
を継承した独自のクラスを生成し、MutableLiveData
を使用して内部的な変更用と公開用のプロパティを定義しておきます。
class MyWebViewClient : WebViewClient() {
private val m_errMsg = MutableLiveData("")
val errMsg:LiveData<String> = m_errMsg
private val m_errHttoMsg = MutableLiveData("")
val errHttoMsg:LiveData<String> = m_errHttoMsg
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?,
) {
super.onReceivedError(view, request, error)
m_errMsg.value = error.toString()
}
override fun onReceivedHttpError(
view: WebView?,
request: WebResourceRequest?,
errorResponse: WebResourceResponse?,
) {
super.onReceivedHttpError(view, request, errorResponse)
m_errHttoMsg.value = errorResponse.toString()
if (errorResponse != null) {
var statusCode = errorResponse.statusCode
if (statusCode == 404) {
}
}
}
}
onReceivedHttpError
onReceivedHttpError
メソッドがオーバーライドして、errorResponse
からstatusCode
を介してHTTPコードを取得可能です。
class MyWebViewClient : WebViewClient() {
// 〜〜〜〜〜〜〜〜〜〜〜〜〜
override fun onReceivedHttpError(
view: WebView?,
request: WebResourceRequest?,
errorResponse: WebResourceResponse?,
) {
super.onReceivedHttpError(view, request, errorResponse)
m_errHttoMsg.value = errorResponse.toString()
if (errorResponse != null) {
var statusCode = errorResponse.statusCode
if (statusCode == 404) {
}
}
}
}
onReceivedError
他にもWebリソースのそもそもの読み込みエラーを検知するonReceivedError
などをあります。
class MyWebViewClient : WebViewClient() {
// 〜〜〜〜〜〜〜〜〜〜〜〜〜
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?,
) {
super.onReceivedError(view, request, error)
m_errMsg.value = error.toString()
}
}
全体のコード
package com.amefure.test
import android.os.Bundle
import android.webkit.WebResourceError
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val myWebView: WebView = findViewById(R.id.web_view)
myWebView.settings.javaScriptEnabled = true
val client = MyWebViewClient()
myWebView.setWebViewClient(client)
myWebView.loadUrl("https://appdev-room.com/")
val msgObserver = Observer<String> {it
Toast.makeText(this,it.toString(),Toast.LENGTH_SHORT)
.show()
}
client.errHttoMsg.observe(this,msgObserver)
}
}
class MyWebViewClient : WebViewClient() {
private val m_errMsg = MutableLiveData("")
val errMsg:LiveData<String> = m_errMsg
private val m_errHttoMsg = MutableLiveData("")
val errHttoMsg:LiveData<String> = m_errHttoMsg
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
return false
}
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?,
) {
super.onReceivedError(view, request, error)
m_errMsg.value = error.toString()
}
override fun onReceivedHttpError(
view: WebView?,
request: WebResourceRequest?,
errorResponse: WebResourceResponse?,
) {
super.onReceivedHttpError(view, request, errorResponse)
m_errHttoMsg.value = errorResponse.toString()
if (errorResponse != null) {
var statusCode = errorResponse.statusCode
if (statusCode == 404) {
}
}
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。