gpt4 book ai didi

java - HTTP 请求和线程

转载 作者:行者123 更新时间:2023-12-01 10:08:02 26 4
gpt4 key购买 nike

首先,我为我的英语道歉。

我有两个关于此方法的问题,该方法负责将请求 POST 到 PHP 服务器。

第一个问题是我遇到错误并且应用程序崩溃了。首先是因为我必须创建一个线程并将我的逻辑放入其中,但现在应用程序关闭而不显示任何内容。

第二个问题是我不知道如何作为线程中的内容返回。应该写入一个变量,然后返回该值。为了显示代码,我设置了固定返回 true。

public boolean hacerPeticion(final String servicio, final Map params){
new Thread(new Runnable()
{
@Override
public void run()
{
String requestURL = R.string.http_base_url + servicio;

try {
HttpUtility.sendPostRequest(requestURL, params);
String response = HttpUtility.readSingleLineRespone();

JSONObject jsonObj = parsearJSON(response);

if(jsonObj != null){
int error_code;
try {
error_code = Integer.parseInt(jsonObj.getString("error"));
} catch(NumberFormatException nfe) {
error_code = 99;
}

if(error_code == 0){
// true;
}else{
// false;
}
}else{
// false;
}
} catch (IOException ex) {
// false;
} catch (JSONException e) {
// false;
}
HttpUtility.disconnect();
}
}).start();

return true;
}

谢谢!

最佳答案

第一个问题

你完全忽略了你的错误。实际上打印异常,这样你就可以看到出了什么问题。

catch (IOException ex) {
ex.printStackTrace();
}
<小时/>

第二个问题

您的错误很可能来自这一行,因为R.string.http_base_url返回一个int,而不是字符串。

String requestURL = R.string.http_base_url + servicio;

要解决该特定问题,您需要一个 Context 来获取实际的字符串值。例如,你可以这样做

String requestURL = getApplicationContext().getString(R.string.http_base_url) + servicio;
<小时/>

第三个问题

您正在使用低级线程而不是 AsyncTask(或其他一些网络库,例如 VolleyOkHttp,它们使网络请求变得容易)。

几乎没有理由在 Android 代码中使用 Java Thread。无论如何,Handler 是在这种情况下使用的更正确的类。

<小时/>

第四个问题

由于您使用的是异步代码,因此您不能简单地期望返回值立即返回。您的方法将始终返回 true (可能在线程启动之前)。

我推荐的方法是use a callback ,就像我之前已经回答过的那样。

关于java - HTTP 请求和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36319398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com