首先,我对我的英语表示歉意。
我对此方法有2个问题,它将负责向POST请求发送到PHP服务器。
第一个问题是我有一个错误,应用程序崩溃了。首先是因为我必须创建一个线程并将逻辑放入其中,但是现在APP关闭时没有显示任何内容。
第二个问题是,我不知道如何在线程中以某种形式返回。应该写一个变量,然后返回那个值。为了显示代码,我将固定返回值设为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(或其他一些使网络请求变得容易的其他网络库,例如Volley或OkHttp)。
几乎没有理由在Android代码中使用Java
Thread
。无论如何,Handler
是在该情况下使用的更正确的类。第四个问题
由于您正在使用异步代码,因此不能简单地期望返回值立即返回。您的方法将始终返回
true
(甚至在线程启动之前)。我建议的方法是use a callback,就像我之前已经回答过的那样。