【问题标题】:Android Studio Asynchronous method error [duplicate]Android Studio异步方法错误[重复]
【发布时间】:2018-06-09 12:54:08
【问题描述】:

我正在尝试在 Android Studio 中发出 GET 请求,但我不明白为什么此方法在 Eclipse 中作为 Java 程序有效,但在 Android Studio 中无效,所以我认为它与威胁有关,所以我做了对异步任务的调用。
我的代码如下所示:

调用方法:

private static class GetFarmaciasTask extends AsyncTask<String,String,String[][]>{
    protected String[][] doInBackground(String... urls) {
        StringBuilder result = new StringBuilder();
        try {
            URL url = new URL("https://mikelmoli.000webhostapp.com/PHP/json.php");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = rd.readLine()) != null) {
                result.append(line);
            }
            rd.close();
            JSONObject jsonO = new JSONObject(result.toString());
            //JSONObject myResponse = jsonO.getJSONObject("data");
            JSONArray tsmResponse = (JSONArray) jsonO.get("data");
            String[] indices = {"Nombre", "Provincia", "Poblacion", "Calle", "Numero", "Telefono"};
            String[][] datos = new String[tsmResponse.length()][indices.length];
            for (int i = 0; i < tsmResponse.length(); i++) {
                for (int j = 0; j < indices.length; j++) {
                    datos[i][j] = tsmResponse.getJSONObject(i).getString(indices[j]);
                }
            }
            return datos;
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (JSONException ej) {
            ej.printStackTrace();
        }
        return null;
    }
}

错误在这行代码中:

BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

正如我之前所说,这个方法在 Eclipse 中作为一个独立的方法工作。

一些让我想到线程错误的错误:

android.os.NetworkOnMainThreadException
引起:android.os.NetworkOnMainThreadException

【问题讨论】:

  • 附带说明,如果您的 GET 请求是 REST,请查看使用改造库,因为它处理后台网络请求和对模型的 JSON 解析。

标签: java android http android-asynctask


【解决方案1】:

这很可能是因为如果您使用AsyncTask 的方式。如果您看到该异常,您可能是直接调用doInBackground()。这篇文章解释了AsyncTask 的工作原理并且应该有所帮助:http://hiqes.com/androids-asynctask-explained/

此外,它们是一次性执行对象,因此我建议不要将其设为 static。将其作为Activity 之类的内部类还有其他一些微妙的陷阱,这可能会导致内存泄漏,所以要小心。

【讨论】:

  • 我已经阅读了这篇文章,它非常有用,谢谢。尽管如此,我仍然无法处理我需要的返回数据。我调用扩展 AsyncTask 的类的 execute() 方法,但是,如何从方法 doInBackground() 获取返回值?我可以调用 onPostExecute 吗?
  • 你返回doInBackground()末尾的数据(对象)。 onPostExecute() 方法将自动被调用,并为您提供doInBackground() 返回的数据。您不直接调用任何回调。
  • 谢谢,我现在明白了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2016-08-04
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多