【Kotlin/Android Studio】WebViewでHTTPエラーハンドリングの実装方法!

【Kotlin/Android Studio】WebViewでHTTPエラーハンドリングの実装方法!

この記事からわかること

  • Kotlin/Android StudioWebView使い方
  • WebViewClientonReceivedErrorメソッド
  • HTTPエラー取得する方法
  • エラーハンドリング方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

参考文献:公式リファレンス:WebView でのウェブアプリの作成

環境

WebViewでHTTPエラーを取得する方法

AndroidのWebViewでHTTPエラーを取得するにはWebViewClientonReceivedHttpErrorメソッドを使用します。WebViewClientWebViewを制御するためのクラスでアプリ内での遷移や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

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

公式リファレンス: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) {

            }
        }
    }
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index