我有一个在套接字期间与服务器通信的应用。 首先我这样做了:
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。
所以: 我需要的是:
非常感谢!!!!!
答案 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
}
}
}
}