我有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());
答案 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(); }
}