JsonObjectRequest GET Request在方法返回值后检索值



我正试图通过GET请求检索JsonObject。当我在代码中设置Breakpoints时,我看到count((方法什么都不返回。之后调用内部类的onResponse方法,并检索所需的值。

我正在save((方法内部调用count((方法。为了创建一个JSONObject。该代码在检索正确的客户计数之前创建JSONObject。

我正在使用名为AppController的自定义请求队列来对网络请求进行排队。我希望有人能理解这种奇怪的行为。

@Override
    public void save(Customer customer) throws JSONException {
        int zw = count();
        JSONObject obj = new JSONObject();
        obj.put("customernumber", count + 1);
        obj.put("name", customer.getName());
        obj.put("lastname", customer.getLastname());
        obj.put("phonenumber", customer.getPhonenumber());
        obj.put("addressid", customer.getAdressID());
        obj.put("password", customer.getPassword());
        String urlJsonObj = URL;
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                urlJsonObj, obj,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        System.out.println(response);
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d("Error: " + error.getMessage());
            }
        });
        AppController.getInstance().addToRequestQueue(jsonObjReq);
    }
@Override
    public int count() {
        String countURL = URL + "/count";

        JsonObjectRequest jsonObjReq = new JsonObjectRequest
                (Request.Method.GET, countURL, null, new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {

                        try {
                            // Parsing json object response
                            // response will be a json object
                            count = response.getInt("count");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d( "Error: " + error.getMessage());
                    }
                });
        AppController.getInstance().addToRequestQueue(jsonObjReq);
        return count;

AppController网络队列

public class AppController extends Application {
    public static final String TAG = AppController.class
            .getSimpleName();
    private RequestQueue mRequestQueue;
    private static AppController mInstance;
    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }
    public static synchronized AppController getInstance() {
        return mInstance;
    }
    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req, String tag) {
        // set the default tag if tag is empty
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        getRequestQueue().add(req);
    }
    public <T> void addToRequestQueue(Request<T> req) {
        req.setTag(TAG);
        getRequestQueue().add(req);
    }
    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }

发生了什么

发生这种情况的原因是线程使用不正确。count()函数在后台线程中执行网络请求,因此当我们从save()函数调用它时,它不会立即返回计数。

解决方案

等待来自计数API的响应,然后执行保存操作。用以下替换上述实施

@Override
public void save(Customer customer) throws JSONException {
    count();
} 
private void performSave(Customer customer, int count) throws JSONException {
    int zw = count; // Finally received the count
    JSONObject obj = new JSONObject();
        obj.put("customernumber", count + 1);
        obj.put("name", customer.getName());
        obj.put("lastname", customer.getLastname());
        obj.put("phonenumber", customer.getPhonenumber());
        obj.put("addressid", customer.getAdressID());
        obj.put("password", customer.getPassword());
    String urlJsonObj = URL;
    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
            urlJsonObj, obj,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    System.out.println(response);
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d("Error: " + error.getMessage());
        }
    });
    AppController.getInstance().addToRequestQueue(jsonObjReq);
}
@Override
public int count(Customer customer) {
    String countURL = URL + "/count";

    JsonObjectRequest jsonObjReq = new JsonObjectRequest
            (Request.Method.GET, countURL, null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    try {
                        // Parsing json object response
                        // response will be a json object
                        count = response.getInt("count");
                        performSave(customer, count);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d( "Error: " + error.getMessage());
                }
            });
    AppController.getInstance().addToRequestQueue(jsonObjReq);
    return 0; // Remove this return type as we will not use it anymore
}

最新更新