Строка не правильно инициализирована? - PullRequest
0 голосов
/ 03 мая 2018

Мне трудно заставить это приложение работать. Кажется, я не могу найти подходящую ситуацию, которая послужила бы своего рода руководством. Очевидно, words не распознается как строковый ресурс, и тогда мой Scrape метод является «неразрешенной ссылкой»?

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

    val texx: TextView=findViewById(R.id.text1) as TextView
    val button:Button=findViewById(R.id.button1) as Button

    button.setOnClickListener(object : View.OnClickListener{
        override fun onClick(v: View) {
            Scrape().execute() //should work tho

        }
    })


    class Scrape() :AsyncTask<Void, Void, Void>() {

        lateinit var words: String

        override fun doInBackground(vararg params: Void?): Void? {

        try {
            val html = Jsoup.connect("https://www.wikipedia.com/en/Canada").get()
            words = html.text()

        }
        catch (e: Exception) {
            e.printStackTrace()
        }

        return null
    }

        override fun onPostExecute(result: Void?) {
            super.onPostExecute(result)

            texx.text = getString(R.string.words)

        }

}

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Один из способов сделать это будет со слушателем (хотя и не очень элегантно):

  • Определение интерфейса для слушателя в вашей активности:

    interface WordsListener {
        fun onWordsReady(words: String)
    }
    
  • Добавьте его в Scrape's Конструктор:

    class Scrape(val wordsListener: WordsListener) : AsyncTask<Void, Void, Void>() {
    
  • И передайте его при создании Scrape в вашем onCreate(). Внутри этого слушателя вы теперь можете получить доступ к переменной texx.

    Scrape(object: WordsListener {
        override fun onWordsReady(words: String) {
            texx.text = words
        }
    }).execute()
    

Другой возможностью было бы сделать texx переменной класса и пометить Scrape как внутренний класс . Таким образом, он будет иметь доступ к texx. Помните, однако, что поскольку внутренние классы содержат ссылку на внешний класс и могут обращаться к внешним элементам класса, это может в некоторых случаях приводить к утечкам памяти (например, утечка вашей активности)

Некоторые другие улучшения:

  • вы не читаете из words, определенного в Scrape, зачем это нужно? Вы хотите использовать это, или R.id.words? Этот бит сбивает с толку
  • исправить ваши отступы (отступы очень важны для ясности при чтении кода)
  • обратите внимание на имена переменных, например. texx, text1, button1 и т. Д. Не лучшие имена
0 голосов
/ 03 мая 2018

R.string.words будет ссылаться на значение внутри вашего файла strings.xml. Попробуйте отправить значение 'words' в результирующий параметр asynctask

...