Сбой приложения Kotlin при запуске запроса get - PullRequest
0 голосов
/ 08 июля 2019

У меня очень базовые знания, но в основном у меня есть кнопка, у которой есть прослушиватель, и когда эта кнопка нажата, она должна отправлять GET-запрос на определенный URL-адрес, но каждый раз, когда я нажимаю кнопку, просто вылетает мое приложение, logcat не 'не говоря уже о проблеме и просто показывает, что приложение закрыто.

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

Я пытался использовать несколько библиотек, но все они, похоже, имеют тот же результат, когда он просто падает, я дал ему разрешения на доступ в Интернет, поэтому он долженбудьте хороши с этой стороны, библиотека, которую я сейчас использую в этой версии: 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 Ответ

4 голосов
/ 08 июля 2019

Я видел твой код. Кажется, вы выполняете сетевой вызов в главном потоке, что вызывает 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}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...