【问题标题】:JsonObjectRequest GET Request retrieves value after method returns valueJsonObjectRequest GET 方法返回值后请求获取值
【发布时间】:2021-07-23 03:01:20
【问题描述】:

我正在尝试通过 GET 请求检索 JsonObject。当我在代码中设置断点时,我看到 count() 方法没有返回任何内容。之后调用内部类的 onResponse 方法并检索所需的值。

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

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

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

【问题讨论】:

    标签: java android json rest


    【解决方案1】:

    发生了什么?

    这是由于线程使用不正确造成的。 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2019-03-07
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 2022-12-31
      相关资源
      最近更新 更多