Получение HTML-кода с веб-сайта в setText при редактировании текста

#android #kotlin

#Android #kotlin

Вопрос:

У меня было много ошибок, и во время поиска я получил много разных решений, которые меня смутили, и поэтому я пишу этот пост, чтобы найти один окончательный ответ. Итак, как указано в названии, я пытаюсь заставить свое приложение получать HTML-код ссылки на веб-сайт, которую я ему передаю, а затем извлекать из нее информацию для установки в мой EditText. Я попытался поискать вокруг, и решение, которое я получил и немного изменил, заключалось в использовании этого служебного класса

 import androidx.appcompat.app.AppCompatActivity
import java.io.BufferedReader
import java.io.InputStreamReader
import java.net.MalformedURLException
import java.net.URL

object ContentScrapper {


    fun getHTMLData(activity: AppCompatActivity,url: String, scrapListener: ScrapListener) {
        Thread(Runnable {

            val google: URL?
            val `in`: BufferedReader?
            var input: String?
            val stringBuffer = StringBuffer()

            try {
                google = URL(url)
                `in` = BufferedReader(InputStreamReader(google.openStream()))
                while (true) {
                    if (`in`.readLine().also { input = it } == null)
                        break
                    stringBuffer.append(input)
                }
                `in`.close()

                activity.runOnUiThread {
                    scrapListener.onResponse(stringBuffer.toString())
                }
            } catch (e: MalformedURLException) {
                e.printStackTrace()
                activity.runOnUiThread {
                    scrapListener.onResponse(null)
                }
            }
        }).start()

    }


    interface ScrapListener {
        fun onResponse(html: String?)
    }
}
 

Как это в моей Основной деятельности

 ContentScrapper.getHTMLData(this,"http://google.com/",object : ContentScrapper.ScrapListener{
            override fun onResponse(html: String?) {
                if(html != null) {
                    editTexttest.setText(html)
                } else {
                    Toast.makeText(this@SplashActivity,"Not found",Toast.LENGTH_LONG).show()
                }
            }
        })
 

И я так и сделал, но инициализация EditText таким образом, казалось, возвращала нулевую ошибку

 val testingbox: EditText = findViewById(R.id.editTexttest)
 

Итак, я огляделся и обнаружил, что мне не нужно инициализировать, и я мог бы просто выполнить editTexttest.setText?

Но затем я получил эти ошибки

     java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
        at com.example.myapplication.MainActivity$onCreate$1.onResponse(MainActivity.kt:41)
        at com.example.myapplication.ContentScrapper$getHTMLData$1$2.run(Util.kt:31)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
 

Строка 41 была edittextest.setText, а строка 31 была scrapListener.onResponse(StringBuffer.toString()).

Если бы кто-нибудь мог объяснить, что не так, это было бы здорово. Спасибо.

РЕДАКТИРОВАТЬ: я просматривал туннель и все время смотрел на неправильную активность. Глупая ошибка с моей стороны.

Комментарии:

1. покажите нам соответствующий файл .xml. activity_main.xml досье.

2. либо идентификатор неверен, либо вы вызываете findViewById(R.id.editTexttest) слишком рано (т.е. До того, как было установлено представление).