首先,我为我的英语道歉。
我有2个关于此方法的问题将负责向PHP服务器发出POST请求。
第一个问题是我有错误并且应用程序崩溃了。首先是因为我必须创建一个线程并将我的逻辑放入其中,但现在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;
}
谢谢!
答案 0 :(得分:1)
第一个问题
你完全无视你的错误。实际上打印Exception,这样你就可以看出出了什么问题。
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
(可能在Thread开始之前)。
我推荐的方法是use a callback,就像我之前已经回答过的那样。
答案 1 :(得分:0)
听起来你在谈论某种回调模式。我想崩溃的原因是你阻止了UI线程导致应用程序freeze,对用户没有反应。这是一个猜测因为你只给了一个smigit的代码。实现回调或更好地使用内置于框架中的回调。如果这是android onActivityResult是一个回调的例子。