开始获取请求时,Kotlin应用程序崩溃

时间:2019-07-08 03:08:18

标签: android kotlin

我有非常基本的知识,但是基本上我有一个带有侦听器的按钮,当按下该按钮时,它应该将GET请求发送到特定的URL,但是每次按下该按钮,它只会使我的应用程序崩溃,logcat不会崩溃提这个问题,只是表明该应用已关闭。

I/System: core_booster, getBoosterConfig = false
I/Process: Sending signal. PID: 18019 SIG: 9

我曾尝试使用多个库,但是它们似乎在崩溃时都具有相同的结果,我为它提供了Internet权限,因此该部分应该很好,当前在该版本上使用的库是khttp


import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import khttp.get

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
            botao_off_1.setOnClickListener {
                val ipAddress = get(url = "http://192.168.1.1/27/off").jsonObject.getString("origin")
            }
    }
}

应该在后端非常基础,并且只有几个按钮。

我希望它能够完成请求,IP和所有其他信息都应该正确,但是会崩溃。

编辑:只有一些事情我把代码DHAVAL ASODARIYA发布并修改了它,它仍然崩溃,但是我设法将问题归结为ConnectException,所以我每次尝试发出请求时都尝试捕获它,现在它可以工作了像黄油。

对不起,代码混乱

这只是实际执行任何操作的部分

    override fun doInBackground(vararg params: Any?) {
        try {
            val url = params[0]
            val ipAddress = get(url as String)
        }
        catch (e: ConnectException) {}
    }
}


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
            this.botao_off_1.setOnClickListener {
                EnviarGet().execute("http://192.168.1.1/27/off")
            }
    }
}

1 个答案:

答案 0 :(得分:4)

我看过您的代码。看来您正在主线程上进行网络调用,这导致NetworkOnMainThreadException

因此,在主线程上执行调用使用异步任务来进行网络调用。

class  GetMyIP : AsyncTask<Any, Any, Any>()
{

  override fun onPreExecute() {
    super.onPreExecute()
  }

  override fun doInBackground(vararg params: Any?) {
    var url = params[0]
    // Make your network call here and return result
    TODO("not implemented") 
  }

  override fun onPostExecute(result: Any?) {
    super.onPostExecute(result)
    // The data you have return from doInBackground will be received here.
    // So now you can parse the result.
  }
}

通过单击按钮调用为,

GetMyIP().execute("{URL HERE}")