使用Volley从php获取一组对象

时间:2017-11-17 19:57:29

标签: android json android-studio android-volley

我有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));
?>

这就是结果:

  

{&#34;类别&#34;:[{&#34; ID&#34;:&#34; 1&#34;&#34;名称&#34;:&#34;测试&#34; },{&#34; ID&#34;:&#34; 2&#34;&#34;名称&#34;:&#34; TEST2&#34;}]}

现在我想获取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:这是我在我主要使用的代码。

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());

2 个答案:

答案 0 :(得分:0)

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

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();
}

<强>更新

您使用不正确的方式检索数据,请检查我的&#34; getAllCategories&#34;方法,无效。

您的数据在听众处收到:

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

    @Override
    public void returnError() {

    }
};

答案 1 :(得分:0)

首先检查您的服务器响应。使用浏览器手动运行您的PHP。然后得到它的json响应。如果它的空或错误,在你的服务器或PHP的问题。有时这些类型的事情发生在本地主机上,阻塞端口和如果它有一个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();  }
                    }