Android Volley Post Looping

时间:2015-09-28 16:17:43

标签: android android-volley

我的代码是这样的

String url = "http://192.168.10.10/post/data.php";
StringRequest postRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        try {
            JSONObject jsonResponse = new JSONObject(response).getJSONObject("respond");
            String  codeid = jsonResponse.getString("CodeID");
            Log.d("CodeID", codeid);
            } catch (JSONException e) {
            e.printStackTrace();
        }
    }
},
new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        error.printStackTrace();
    }
}
) {
    @Override
    protected Map<String, String> getParams()
    {
        Map<String, String>  params = new HashMap<>();
        ArrayList<Product> product = dataSource.getAllProduct();

        for (Product bk : product) {
            params.put("code1", bk.getCode1());
            params.put("code2", bk.getCode2());

        }
        return params;
    }
};
Volley.newRequestQueue(this).add(postRequest);

我在数据库中有数据(大约10行),并希望通过post发送所有行。使用上面的代码我可以发送POST但只有1行。

我尝试过使用

            for (int i=0; i<=product.size(); i++ )
            {

            }

替代

for (Product bk : product)

仍然没有运气。你能告诉我如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您使用的是HashMap,这有点像键值对。 迭代product时,您正在为相同的键("code1""code2")分配新值。所以你的网址可能是正确的,但你的params总是被覆盖。 调试代码时,您应该注意到params最多有2个项目

你也可以试试这个:

for (int i = 0; i <= product.size(); i++) {
    Product myProduct = product.get(i);
    params.put("product" + i + "_code1", myProduct.getCode1());
    params.put("product" + i + "_code2", myProduct.getCode2());
}

但这不是一个很好的方法。

你可能会更好:

ArrayList<Product> products = dataSource.getAllProduct();
Map<String, String> params = new HashMap<>();

for (int i = 0; i <= products.size(); i++) {
    Product product = products.get(i);
    String key = "product" + i;
    String value = URLEncoder.encode("code1=" + product.getCode1() + "&" +
                                     "code2=" + product.getCode2(), "UTF-8");
    params.put(key, value);
}

return params;

URLEncoder.encode将对您的产品进行urlencode-String。这是必需的,因为网址可能会被所有&弄乱。对于编码,这些将是&amp;

你需要在另一端再次decode他们!

答案 1 :(得分:0)

我遇到了类似的问题。我将所有的arraylist放在一个单独的java文件Common中并从那里获取并将其放入一个新的arraylist。在服务器端我有一个JSON数组接受键的多个值这应该适用于你们都很好。
 {

    @Override
    protected Map<String, String> getParams() throws AuthFailureError {

        Map<String,String> params = new HashMap<String,String>();
         ArrayList<String> arrayList=new ArrayList<>();
         ArrayList<String> arrayList2=new ArrayList<>();

        for(String s : Common.myProduct1){//myProduct1 has ur contents for getCode1()
            arrayList.add(s);
        }

        for(String s: Common.myProduct2){//myProduct2 has ur contents for getCode2()
            arrayList2.add(s);
        }


        Log.v("Params:",params.toString());
 params.put("key1",arrayList.toString().replace("[","".replace("]","")));
            params.put("key2",arrayList2.toString().replace("[","".replace("]","")));

        return params;
    }
};