Как говорится в сообщении об ошибке, вы выполняете сетевые вызовы в главном потоке, и это запрещено, поскольку сетевой вызов - это очень длительная операция.
Функция execute выполняет запрос API в синхронизированном режиме. в то время как функция enqueue делает это асинхронным способом, как вы, вероятно, знаете, когда вы хотите сделать асинхронный вызов, вы не можете возвращать вещи из своей функции, потому что код больше не работает в последовательном порядке, поэтому вы должны создайте интерфейс, похожий на обратный вызов.
interface MyCallback {
fun onResult(result: bool)
}
fun login(un: String, pwd: String, context: Context, myCallback: MyCallback) {
val urlBuilder = HttpUrl.Builder()
.scheme("https")
.host("dev.api.gostyle.ovh")
.addPathSegment("api")
.addPathSegment("user")
.addPathSegment("auth")
.addQueryParameter("username",un)
.addQueryParameter("password",pwd)
.build()
var request = Request.Builder()
.url(urlBuilder)
.build()
client.newCall(request).enqueue(object: Callback {
override public fun onFailure(call: Call, e: IOException) {
throw IOException("Unexpected code $response")
}
override public fun onResponse(call: Call, response: Response) {
if (!response.isSuccessful) throw IOException("Unexpected code $response")
val responseData = response.body?.string()
val json = JSONObject(responseData)
val owner = json.getString("token")
if(response.code == 200) {
saveToken(context, owner)
myCallback,onResult(true)
}
myCallback,onResult(false)
}
})
}
Таким образом, не будет никакого типа возврата для функции входа в систему, и вы можете вызвать эту функцию таким способом.
class LoginActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.setContentView(R.layout.activity_login);
val loginbtn = findViewById<Button>(R.id.loginbtn)
loginbtn.setOnClickListener(){
login(this, object : MyCallback {
public override fun onResult(result: Boolean) {
// Do something with the result returned
}
})
}
fun login(context: Context, callback, MyCallback){
var okHttpHelper = OkHttpHelper()
val uninput = findViewById<EditText>(R.id.username_input).text.toString()
val pwdinput = findViewById<EditText>(R.id.password_input).text.toString()
if(okHttpHelper.login(uninput,pwdinput,context, callback)) {
val gameActivity = Intent(this@LoginActivity, MyPromosActivity::class.java)
startActivity(gameActivity)
}
}
}