【问题标题】:get an array of objects from php using Volley使用 Volley 从 php 获取对象数组
【发布时间】:2017-11-17 19:57:29
【问题描述】:

我有一个从数据库返回对象列表的 php 文件。 这是php代码:

<?php
require_once('../connect.php');

$sql = "SELECT * FROM categories";
$result = $conn->query($sql);
$json = new SimpleXMLElement('<xml/>');
if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
      $mydata = $json->addChild('category');
        $mydata->addChild('id',$row['id']);
        $mydata->addChild('name',$row['Name']);
         }
} else {
    echo "0 results";
}
$conn->close();
     echo( json_encode ($json));
?>

结果如下:

{"category":[{"id":"1","name":"test"},{"id":"2","name":"test2"}]}

现在我想获取 android 中的类别列表,我尝试使用此代码执行此操作,但它总是返回空列表:

   public List<Category> getAllCategories(){
        StringRequest stringRequest = new StringRequest(Request.Method.GET,"http://localhost/Android/Categories/Select_All_Categories" ,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            Log.d("TAG","response :"+response);
                            JSONObject jsonObject = new JSONObject(response);
                            JSONArray sts = null;
                            sts = jsonObject.getJSONArray("category");

                            for (int i = 0; i < sts.length(); i++) {
                                JSONObject jo = sts.getJSONObject(i);
                                Category cc = new Category();
                                cc.setId(jo.getInt("id"));
                                cc.setName(jo.getString("name"));
                                ar.add(cc);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        error.printStackTrace();
                    }
                });

        return ar;
    }

有人可以帮助我并告诉我我做错了什么吗?

diegoveloper 的更新:这是我在 main 中使用的代码。

MyListener listener = new MyListener() {
    @Override
    public void returnYourData(List<Category> list) {
        for(Category c:list){
            lc.add(c);
        }
    }

    @Override
    public void returnError() {

    }
};


System.out.println(lc.size());

【问题讨论】:

    标签: android json android-studio android-volley


    【解决方案1】:

    首先检查您的服务器响应。使用浏览器手动运行 php。然后得到它的 json 响应。如果它为空或错误,则说明您的服务器或 php.ini 有问题。有时这些类型的事情会通过阻塞端口等在本地主机中发生。如果它有一个 json 数组。使用以下方法获取其数据。这些方法非常适合我,我在许多应用程序中都使用过。

     RequestQueue rq; //assign as a global variable
     String json_string; //assign as a global variable
     String url = "http://yourphpfilelink.php"; //assign as a global variable
    
    protected void onCreate(Bundle savedInstanceState) { //call below functions inside oncreate
    
            rq = Volley.newRequestQueue(this);
            sendjsonrequest();
    }
    
        public void sendjsonrequest(){
                        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
                            @Override
                            public void onResponse(JSONObject response) {
                                //json_string = response.getString("server_response");
                                jsonget(response);
                            }
                        }, new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                            }});
                        rq.add(jsonObjectRequest);
                    }
    
                 public void jsonget(JSONObject json_string1){
                            try {
                                JSONArray jsonArray = json_string1.getJSONArray("server_response");
                                int count = 0;
                                String name1,name2,name3;
                                msg="";
                                while (count<jsonArray.length()){
                                    JSONObject JO = jsonArray.getJSONObject(count);
                                    name1 = JO.getString("name1");
                                    name2 = JO.getString("name2");
                                    name3 = JO.getString("name3");
                                    msg = msg+"name1: " + name1 + "\nname2: "+ name2 + "\nname3: " + name3 + "C\n\n";
                                    count++;        }
                                yourtextview.setText(msg);
                            } catch (JSONException e) {
                                e.printStackTrace();  }
                        }
    

    【讨论】:

      【解决方案2】:

      因为你的请求是异步的,你可以使用一个接口来返回你的数据。

      public void getAllCategories(final YourInterfaceListener listener){
              StringRequest stringRequest = new StringRequest(Request.Method.GET,"http://localhost/Android/Categories/Select_All_Categories" ,
                      new Response.Listener<String>() {
                          @Override
                          public void onResponse(String response) {
                              try {
                                  Log.d("TAG","response :"+response);
                                  JSONObject jsonObject = new JSONObject(response);
                                  JSONArray sts = null;
                                  sts = jsonObject.getJSONArray("category");
      
                                  for (int i = 0; i < sts.length(); i++) {
                                      JSONObject jo = sts.getJSONObject(i);
                                      Category cc = new Category();
                                      cc.setId(jo.getInt("id"));
                                      cc.setName(jo.getString("name"));
                                      ar.add(cc);
                                  }
                                  listener.returnYourData(ar);
                              } catch (JSONException e) {
                                  e.printStackTrace();
                                  listener.returnError();
                              }
      
                          }
                      },
                      new Response.ErrorListener() {
                          @Override
                          public void onErrorResponse(VolleyError error) {
                              error.printStackTrace();
                              listener.returnError();
                          }
                      });
      
          }
      

      你的界面:

      public interface YourInterfaceListener {
         void returnYourData(List<Category> list);
         void returnError();
      }
      

      更新

      你使用了不正确的方法来检索数据,检查我的“getAllCategories”方法,是无效的。

      你的数据在监听器上被接收到:

      MyListener listener = new MyListener() {
          @Override
          public void returnYourData(List<Category> list) {
               // HERE YOU HAVE THE DATA, UPDATE YOUR UI HERE.
          }
      
          @Override
          public void returnError() {
      
          }
      };
      

      【讨论】:

      • 仍然得到一个空数组
      • 我不这么认为,你能更新你的代码吗?
      • 我创建了界面并在我的班级中复制了您的代码,然后我使用此代码在我的主目录中获取列表
      • 把你的主代码,我想看看你是怎么做的
      • 我更新了我的答案,请检查并告诉我它是否有效
      猜你喜欢
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多