HTTP请求和线程

时间:2016-03-30 20:48:24

标签: java android

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

我有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;
}

谢谢!

2 个答案:

答案 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(或其他一些网络库,如VolleyOkHttp,这使网络请求变得简单)。

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

第四个问题

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

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

答案 1 :(得分:0)

听起来你在谈论某种回调模式。我想崩溃的原因是你阻止了UI线程导致应用程序freeze,对用户没有反应。这是一个猜测因为你只给了一个smigit的代码。实现回调或更好地使用内置于框架中的回调。如果这是android onActivityResult是一个回调的例子。