【问题标题】:Boolean method can not return anything布尔方法不能返回任何东西
【发布时间】:2016-07-05 22:30:53
【问题描述】:

我正在开发一个 Android 应用程序,现在我正在为登录系统编写一些方法。我正在尝试创建一个 boolean 方法,该方法根据服务器的响应返回 true 或 false。这是我的代码:

public static boolean login(final String name, final String password) {

    final boolean result;
    Thread nt = new Thread() {
        @Override
        public void run() {


            URL url;
            HashMap<String, String> postDataParams = new HashMap<String, String>();

            postDataParams.put("name", name);
            postDataParams.put("password", password);

            try {

                url = new URL("");

                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(15000);
                conn.setConnectTimeout(15000);
                conn.setRequestMethod("POST");
                conn.setDoInput(true);
                conn.setDoOutput(true);


                OutputStream os = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));

                writer.flush();
                writer.close();
                os.close();
                int responseCode = conn.getResponseCode();

                if (responseCode == HttpsURLConnection.HTTP_OK) {
                    return true;
                } else {
                    return false;
                }

            } catch (Exception e) {
                return false;
                e.printStackTrace();
            }
        }

    };
    nt.start();
}

问题是每个返回语句都被突出显示,因为cannot return a value from a method with void result type,这是我无法理解的,因为它被明确定义为boolean 方法。我想,这与我创建的新线程有关,但由于此应用程序将在 Android 设备上运行,因此我必须在单独的线程中运行我的查询。

提前致谢!

【问题讨论】:

  • 也许你可以尝试等待线程完成,并从线程中将局部变量更改为函数boolean login并在函数通过等待语句后返回

标签: java android multithreading return boolean


【解决方案1】:

您的所有代码都在public void run() 方法中,该方法返回void。 因此不允许返回boolean

【讨论】:

  • 哇,我没有考虑这个细节。这样的错误。我该如何解决?
  • 您在运行外部创建一个布尔结果变量(仍在登录内部),然后在运行内部调用“return true/false”,而不是调用 result = true/false,然后执行 void return。运行结束后,您返回结果变量作为登录的返回值......我会用这个信息来回答以防万一。
  • @pitazzo 我已经解决了您在单独答案中提到的最新问题
【解决方案2】:

一切都与范围有关。您不能启动一个新线程,然后从线程范围内返回该值。 Thread 类中的 run() 方法具有 void 返回类型。

您必须删除线程,然后将代码直接放入方法中。但是因为是android,不允许主线程连接,所以你必须创建一个回调接口,一旦站点在线程中加载,你就调用接口内部的方法,结果为:真或假。

【讨论】:

    【解决方案3】:

    正如其他人指出的那样,编译错误的原因是您试图在匿名Runnable 实例的run() 方法中返回一个值。 run() 方法是一个 void 方法。

    在评论中,您询问如何“修复它”,以便您的 login 方法可以返回结果。

    简单的答案就是去掉线程和run()方法,直接在login方法中做工作;例如

    public static boolean login(final String name, final String password) {
        try {
            URL url = new URL("some url");
    
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(15000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);
    
            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            // write the post data ...
            writer.flush();
            writer.close();
            os.close();
            int responseCode = conn.getResponseCode();
            return (responseCode == HttpsURLConnection.HTTP_OK);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    

    如果login 必须返回一个值,则该值需要在方法返回时可用。它是同步的。如果您在(另一个)线程中完成工作,则当前线程必须 1)等待该其他线程完成,以及 2)从该线程获取结果。你可以做到,但没有意义。

    如果您的目标是在调用login 时避免阻塞当前线程,那么login 方法需要返回Future 或类似的东西。但最终,使用登录成功/失败状态的代码将需要调用Future.get。那可能需要等待结果,因此阻塞线程。

    最好的答案可能是重新设计 UI 的状态机。

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2011-08-05
      相关资源
      最近更新 更多