【问题标题】:Simplest straight forward way to get a JSON String from a REST URL从 REST URL 获取 JSON 字符串的最简单直接的方法
【发布时间】:2018-07-09 00:50:31
【问题描述】:

我正在尝试从 url 获取 JSON 字符串并将其保存到我的 android 应用程序中的 SQLite 中。

我正在尝试一些教程,然后意识到建议的方法具有 void 返回类型。有没有更简单直接的方法来获取 JSON 字符串并将其放入准备保存到 SQLite 中的数组列表中?

下面是我被困在从 url 获取数据的帮助类 正如他们所说,主线程 OnCreate 不允许这样的后台进程。有没有办法改变 AsyncTask 的返回类型,或者有没有更简单的方法来用 android 获取 JSON 字符串?

public class FetchData extends AsyncTask<Void, Void, Void> {
    @Override
    protected void doInBackground(ArrayList<String>... voids) {
        try {
            URL url = new URL("http://192.168.403.211/api/wordsupdate.php");


            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader (new InputStreamReader(inputStream));
            String line ="";
            while (line != null) {
                line = bufferedReader.readLine();
            }       

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

【问题讨论】:

  • 看看这个:square.github.io/okhttp
  • 所以你想在没有任何第三方库的情况下这样做吗?如果是,你的代码是可以的,如果不是,使用retrofit
  • 不,代码是不是好的,请看下面我的回答
  • 你可以使用Retrofit或者Volley下载JSON文件,然后用Gson就可以轻松解析。我会选择 Retrofit 和 Gson,但这只是我的偏好
  • most simple straight forward 完全基于意见。没有人知道most simple straight forward是哪条路。

标签: android json


【解决方案1】:

在您的代码 sn-p 中,您指定 AsyncTask 参数类型为 Void。 void 表示,它没有任何返回值。根据 AsyncTask 语法,
您必须指定三个参数。 1- InputType- DoInBankground 2- ProgressType - 发布进度。 3- OutputType - OnPostExecute。

异步任务使用的三种类型如下:

Params,执行时发送给任务的参数类型。 进度,在后台计算期间发布的进度单元的类型。 Result,后台计算结果的类型。

在你的 sn-p doInBackground 方法和 AsycTask 类型不匹配。

欲了解更多信息:https://developer.android.com/reference/android/os/AsyncTask.html

【讨论】:

    【解决方案2】:

    查看此链接from Android developer,您可以找到他们的更多信息。

    在您的代码中将“扩展”从

    AsyncTask<Void, Void, Void>
    

    AsyncTask<Void, Void, String>
    

    和doInBackground方法

    protected String doInBackground(ArrayList<String>... voids) 
    

    你会在 onPostExecute 方法中取回字符串

    【讨论】:

      【解决方案3】:

      //AsyncTask 有 onPostExecute 会在后台执行后调用,你会在主线程中得到结果

      class FetchData extends AsyncTask<Void, Void, String> {
          @Override
          protected String doInBackground(Void... voids) {
              try {
                  URL url = new URL("http://192.168.403.211/api/wordsupdate.php");
      
                  HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                  InputStream inputStream = httpURLConnection.getInputStream();
                  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                  StringBuilder builder = new StringBuilder();
                  String line;
                  while ((line = bufferedReader.readLine()) != null) {
                      builder.append(line);
                  }
                  return builder.toString();
              } catch (MalformedURLException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
              return null;
          }
      
          @Override
          protected void onPostExecute(String result) {
              //Your result String is here which runs on MAIN THREAD
              super.onPostExecute(result);
          }
      }
      

      【讨论】:

      • 你有我在主要活动中获取字符串的示例代码吗?
      【解决方案4】:

      是的,有一种方法可以更改返回类型:看看你的extends AsyncTask:上面写着AsyncTask&lt;Void, Void, Void&gt;

      根据Android Developers,这意味着&lt;Params, Progress, Result&gt;

      这意味着您的 ArrayList&lt;String&gt;... voids 也不起作用,因为您将 Params 部分设置为 Void 但尝试获取 ArrayList&lt;String&gt;

      所以,要解决您的问题,请将三个Voids 更改为您需要输入和输出的任何内容。

      但是,要反序列化 JSON,您应该使用外部库(或完全使用 3rd 方库进行 REST 调用)。

      【讨论】:

        【解决方案5】:

        使用 Volley API。检查下面演示 POST 请求的代码。希望你能得到有用的信息。

        public void getAddress(final String uid) {
        
            String url = "Add Url Here"; // Request a string response from the provided URL.
            StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
        
                            JSONArray dataArray;
                            JSONObject jsonObject;
        
                            address_ids = new ArrayList<>();
                            address_names = new ArrayList<>();
                            address_line1 = new ArrayList<>();
                            address_line2 = new ArrayList<>();
                            address_state = new ArrayList<>();
                            address_district = new ArrayList<>();
                            address_taluka = new ArrayList<>();
                            address_pincode = new ArrayList<>();
                            address_status = new ArrayList<>();
                            address_default = new ArrayList<>();
        
        
                            try {
                                jsonObject = new JSONObject(response);
                                dataArray = jsonObject.getJSONArray(JSON_ARRAY);
        
                                //adding response values to respective array
                                for (int i = 0; i < dataArray.length(); i++) {
                                    //Creating a json object of the current index
                                    JSONObject obj;
                                    try {
                                        //getting json object from current index
                                        obj = dataArray.getJSONObject(i);
                                        address_ids.add(obj.getString(TAG_ADDRESS_ID));
                                        address_names.add(obj.getString(TAG_ADDRESS_NAME));
                                        address_line1.add(obj.getString(TAG_ADDRESSLINE_FIRST));
                                        address_line2.add(obj.getString(TAG_ADDRESSLINE_SECOND));
                                        address_state.add(obj.getString(TAG_STATE));
                                        address_district.add(obj.getString(TAG_DISTRICT));
                                        address_taluka.add(obj.getString(TAG_TALUKA));
                                        address_pincode.add(obj.getString(TAG_PINCODE));
                                        address_status.add(obj.getString(TAG_ADDRESS_STATUS));
        
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                                }
        
        
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                            //setting up response values to the fragment
                            //Toast.makeText(getActivity(), "Error:"+response, Toast.LENGTH_LONG).show();
                            Log.e(TAG, "onResponse: " + response);
                            address_name.setText("Name : " + address_names.get(0));
                            address.setText("Address : " + address_line1.get(0) + "," + address_line2.get(0) + "-" + address_pincode.get(0));
                            taluka.setText("Taluka : " + address_taluka.get(0));
                            district.setText("District : " + address_district.get(0));
                            state.setText("State : " + address_state.get(0));
                            mCircularProgressBar.setIndeterminate(false);
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getApplication(), "Taking bit longer", Toast.LENGTH_LONG).show();
                }
        
            }) {
                @Override
                protected Map<String, String> getParams() {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("mk_address_id", address_id);
                    return params;
                }
            };
            queue.add(stringRequest);
        }
        

        【讨论】:

        • 我最终使用了 Volley,但从更简单的代码开始。我会试试你的代码,等我熟悉 Volley 后再回来。
        【解决方案6】:

        Retrofit 2 将为您提供帮助 - 简单易行

        编辑:对于异步任务,请参阅此处的最佳答案

        What arguments are passed into AsyncTask<arg1, arg2, arg3>?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-06
          • 2011-08-22
          • 2019-01-25
          • 1970-01-01
          • 2011-05-17
          相关资源
          最近更新 更多