#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)
слишком рано (т.е. До того, как было установлено представление).