Перед загрузкой в WebView в Android Kotlin проверьте связь с URL-адресом веб-сайта

1

Перед загрузкой веб-сайта в WebView я хочу проверить URL-адрес и убедиться, что он загружается. Если это так, покажите WebView; если нет, показать другой вид с сообщением.

Идея состоит в том, чтобы проверить, может ли веб-сайт быть загруженным, и в зависимости от ответа показать либо экран "Веб-сайт не может быть загружен", либо показать веб-представление с загруженным URL-адресом.

Я уже проверил, доступно ли соединение, поэтому не нужно беспокоиться об этом.

Нужно поддерживать API 25+.

Теги:
kotlin

1 ответ

1

Мое решение ниже пытается сделать две вещи:

  1. Используя AsyncTask " AsyncTask " сайт, а затем

  2. MainActivity контекст из MainActivity, вызовите функцию для отображения WebView (используя WeakReference для достижения этой цели)

class MainActivity : AppCompatActivity() {
private var websiteURL = "https://www.google.com"

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // ...
    webView.webViewClient = WebViewClient()
}

// I called this function after checking that there is Internet connection
private fun connectionResponseFunction(): String {
    return if (isConnected) {
        // *** is connected
        // pass in "this" context from MainActivity
        val downloadData = CheckLink(this)
        downloadData.execute(websiteURL)
    } else {
      // *** not connected
    }
}

private fun showWebView() {
    webView.loadUrl(websiteURL)
}

companion object {
    class CheckLink internal constructor(context: MainActivity) : AsyncTask<String, Void, String>() {
      // Needed if you want to use webView or anything else from MainActivity
        private val activityReference: WeakReference<MainActivity> = WeakReference(context)

        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
            val activity = activityReference.get()
            if (activity == null || activity.isFinishing) return

            if (result == "success") {
                // URL loaded, show webView
                activity.showWebView()
            } else {
                // URL didn't load
            }
        }

        override fun doInBackground(vararg url: String?): String {
            val linkLoaded = loadLink(url[0])
            if (!linkLoaded) {
                return "failure"
            }
            return "success"
        }

        private fun loadLink(urlPath: String?): Boolean {
            try {
                val url = URL(urlPath)
                val connection: HttpURLConnection = url.openConnection() as HttpURLConnection
                connection.setRequestProperty("Connection", "close")
                connection.connectTimeout = 3000
                connection.connect()

                val response = connection.responseCode

                // 200 for success
                return if (response == 200) {
                    true
                } else {
                    false
                }
            } catch (e: Exception) {
              // Handle exceptions
                when (e) {
                    is MalformedURLException -> "loadLink: Invalid URL ${e.message}"
                    is IOException -> "loadLink: IO Exception reading data: ${e.message}"
                    is SecurityException -> { e.printStackTrace()
                        "loadLink: Security Exception. Needs permission? ${e.message}"
                    }
                    else -> "Unknown error: ${e.message}"
                }
            }
            return false  // Error
        }
    }
}
}

Я новичок в Android и Kotlin, поэтому я открыт для любых предложений, чтобы сделать его лучше.

Я не смог найти какой-либо недавний код, который работает для API 25+.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню