передавать данные между действиями в asyncTask и из asyncTask в действия - PullRequest
0 голосов
/ 04 июня 2018

У меня есть приложение, которое связывается с сервером во время сокетов .Сначала я сделал это:

val sock = Socket("192.168.1.108", 5000)

, и приложение упало из-за ошибки: «android.os.NetworkOnMainThreadException», я прочитал об этом и нашел решение для этой ошибки, и решение заключается в созданииsyncTask как внутренний класс, и это то, что я сделал:

class randomChat : AppCompatActivity() {

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

        HandleServer().execute()
    }

    inner class HandleServer: AsyncTask<String, String, String>() {

        override fun doInBackground(vararg p0: String?): String {
            val sock = Socket("192.168.1.108", 5000)
            sock.getInputStream()

            sock.use {
                it.outputStream.write("hello socket world".toByteArray())
            }
            return "Good"
        }

    }
}

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

Итак: что мне нужно, это:

  1. открытый сокет, который все время получает данные с сервера и обновляет представление в действии
  2. Мне нужно иметь возможность иметь editText в действии, которое пользователь нажимает на негоотправить данные на сервер (с сокетом)

Большое спасибо !!!!!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вместо того, чтобы беспокоиться о AsyncTask, я настоятельно рекомендую вам использовать сопрограммы вместо:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.chat_show)
    launch (CommonPool) {
        val sock = Socket("192.168.1.108", 5000)
        sock.use {
            it.outputStream.write("hello socket world".toByteArray())
            withContext(UI) {
                // update the view
            }
            // more socket ops
            withContext(UI) {
                // update the view again
            }
        }
    }
}
0 голосов
/ 05 июня 2018

Вы можете реализовать на текущем сокете, как это, и просто вызвать метод sendDataToNetwork () для editText

Пример: двунаправленный сетевой сокет Android с использованием AsyncTask

Существуют более эффективные способы управления потоками или использования библиотек, таких как RxJava, но для простой простой реализации вышеприведенное должно работать.

...