将活动之间的数据传递给asyncTask,并从asyncTask传递给activity

时间:2018-06-04 19:05:44

标签: android sockets android-studio kotlin

我有一个在套接字期间与服务器通信的应用。 首先我这样做了:

val sock = Socket("192.168.1.108", 5000)

和该应用崩溃,因为错误的:" android.os.NetworkOnMainThreadException&#34,I读到它,我发现该错误的溶液,并将该溶液是创建一个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,用户点击它就可以将数据发送到服务器(使用套接字)
  3. 非常感谢!!!!!

2 个答案:

答案 0 :(得分:0)

你可以像这样在正在进行的套接字上实现,只需为editText调用sendDataToNetwork()方法

Example: Android bi-directional network socket using AsyncTask

有更好的方法来管理线程或使用像RxJava这样的库,但是对于一个基本的简单实现,上面应该可以工作。

答案 1 :(得分:0)

我强烈建议您使用协同程序,而不是打扰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
            }
        }
    }
}