【问题标题】:HTTP requests and threadsHTTP 请求和线程
【发布时间】:2016-03-30 20:48:23
【问题描述】:

首先我为我的英语道歉。

我有 2 个问题,关于这个方法将负责向 PHP 服务器发出 POST 请求。

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

第二个问题是我不知道如何在线程中返回。应该写入一个变量,然后返回该值。为了显示代码,我设置了一个固定的 return 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;
}

谢谢!

【问题讨论】:

  • 能否给出日志错误,让我们做出更好的解决方案?非常感谢你
  • 嗨,现在我无法复制错误日志,当我拨打电话并清理它时应用程序会重新启动。

标签: java android


【解决方案1】:

第一个问题

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

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,就像我之前已经回答过的那样。

【讨论】:

  • 1- 是的,为了写这个问题,我删除了错误的逻辑,只是让评论应该返回,不再赘述。 2 + 3 + 4- 好的,谢谢你的方法。我会读到的。
【解决方案2】:

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

【讨论】:

  • 崩溃肯定是R.string.http_base_url + servicio;引起的
  • developer.android.com/guide/topics/resources/… 表示从字符串资源中获取字符串使用 String string = getString(R.string.hello);在你的情况下 String requestURL = getstring(R.string.http_base_url) + servicio;
  • 是的,我知道,这就是我在回答中的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多