【问题标题】:requesting JSON document with HttpURLConnection and parsing it使用 HttpURLConnection 请求 JSON 文档并解析它
【发布时间】:2017-11-19 14:12:56
【问题描述】:

我有一个应用程序,它的类负责从本地服务器请求 JSON...

这是主要活动:

public class Activity_main extends AppCompatActivity {

    private ArrayList<StructAcount> netAcount = new ArrayList<StructAcount>();
    private TextView textView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.txtJSON);

        WebService.readUrl("http://localhost/match_picture/service.php?action=read");

        String result = WebService.getResult();


        if (result != null) {
            try {
                JSONArray tasks = new JSONArray(result);
                for (int i=0; i<tasks.length(); i++) {
                    StructAcount acount= new StructAcount();
                    JSONObject object = tasks.getJSONObject(i);
                    acount.id = object.getLong("user_id");
                    acount.name = object.getString("user_name");
                    acount.email = object.getString("user_email");

                    netAcount.add(acount);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Toast.makeText(Activity_main.this, "hsh" , Toast.LENGTH_SHORT).show();
        }

        for (StructAcount acount: netAcount) {
            textView.setText(textView.getText() + "username: " + acount.name + "  |  " + "useremail: " + acount.email + "\n");
            Toast.makeText(Activity_main.this, "username: " + acount.name + "\n" + "useremail: " + acount.email , Toast.LENGTH_SHORT).show();
        }
    }

}

...这是 HTTP 请求的类:

public class WebService {

    private static String result;

    public static void readUrl(String server_url) {
       class GetJson extends AsyncTask<String, Void, String> {
           @Override
           protected String doInBackground(String... params) {
               BufferedReader bufferedReader = null;
               String uri = params[0];
               try {
                   URL url = new URL(uri);
                   HttpURLConnection con = (HttpURLConnection) url.openConnection();
                   StringBuilder sb = new StringBuilder();
                   InputStream in = new BufferedInputStream(con.getInputStream());
                   bufferedReader = new BufferedReader(new InputStreamReader(in));

                   String json;
                   while ((json = bufferedReader.readLine()) != null) {
                       sb.append(json);

                   }

                   return sb.toString().trim();


               } catch (MalformedURLException e) {
                   e.printStackTrace();
               } catch (IOException e) {
                   e.printStackTrace();
               }

               return null;

           }

           @Override
           protected void onPostExecute(String s) {
               super.onPostExecute(s);
               WebService.set_result(s);
           }
       }

        GetJson gj = new GetJson();
        gj.execute(server_url);
    }

    public static void set_result(String s) {
        result = s;
    }

    public static String getResult() {
        return result;
    }

}

第一次运行应用程序时,TextView 没有设置任何内容。

当应用程序仍在模拟器的屏幕上时:如果我进行了一些小的更改,例如更改 Toast 消息的文本,我会再次运行应用程序并通过 JSON 值设置 TextView 的文本...

任何人都可以为这种情况提供一些参考或解决方案吗?

【问题讨论】:

  • 原因可能是您的“for 循环”条件“netAcount”变量列表在您首次启动后保存数据。尝试在 OnCreate 方法中初始化 netAccount。
  • 您是否在 AndroidMenifest 文件中授予互联网权限?
  • 是的。正如我所说,它适用于第二次运行

标签: android json android-activity httpurlconnection


【解决方案1】:

出于学习目的,HttpUrlConnection 可能很有用。

对于现实生活,Google 建议使用Android Volley 库。

一些有用的链接:

对于使用带有 HTTPS 的 Android Volley,不需要核对 SSL 证书(请不要)。

为什么?答案是here

【讨论】:

  • 所以我不需要 HttpURLConnection ?
  • 我可以保证 HttpURLConnection 不是 Android 的好选择,因为 Google 在 2013 年推出 Volley:youtube.com/watch?v=yhv8l9F44qo
  • 谢谢你,我会继续努力的。但我认为在这个应用程序中我正确地建立了连接。我改变了算法并解决了问题。我想知道这个算法有什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多