Перед загрузкой веб-сайта в WebView я хочу проверить URL-адрес и убедиться, что он загружается. Если это так, покажите WebView; если нет, показать другой вид с сообщением.
Идея состоит в том, чтобы проверить, может ли веб-сайт быть загруженным, и в зависимости от ответа показать либо экран "Веб-сайт не может быть загружен", либо показать веб-представление с загруженным URL-адресом.
Я уже проверил, доступно ли соединение, поэтому не нужно беспокоиться об этом.
Нужно поддерживать API 25+.
Мое решение ниже пытается сделать две вещи:
Используя AsyncTask
" AsyncTask
" сайт, а затем
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+.