首先,我对我的英语表示歉意。

我对此方法有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(或其他一些使网络请求变得容易的其他网络库,例如VolleyOkHttp)。

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



第四个问题

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

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

10-08 03:16