【问题标题】:How to return single integer value from Volley in Android?如何从 Android 中的 Volley 返回单个整数值?
【发布时间】:2021-12-04 23:02:30
【问题描述】:

我正在尝试使用 Volley 获取单个整数值。

在这个例子中,数字是 14

在调试器中我得到了正确的值 14 并在 try/catch 块中将其分配给 vNumber 但是当我尝试时返回 vNumber 我得到值 0 作为返回的数字。

这是 JSON 结果。

{"result":[{"version":"14"}]}

这里是这个函数的代码:

int vNumber;

public int getVersionNumber() {

    StringRequest stringRequest = new StringRequest(Request.Method.POST, GET_VERSION_NUMBER,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject object = new JSONObject(response);
                        JSONArray jsonArray = object.getJSONArray("result");
                        JSONObject jsonObject = jsonArray.getJSONObject(0);

                        vNumber = jsonObject.getInt("version");

                    } catch (JSONException e) {
                        e.printStackTrace();
                        Log.d(TAG, "JSONException: " + e);
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d(TAG, "VolleyError: " + error);
                }
            });

    RequestQueue requestQueue = Volley.newRequestQueue(context);
    requestQueue.add(stringRequest);

    return vNumber;
}

我已经尝试使用 sharedPreferences 并将值放在 textView 中(当我在 textView 中设置时,该值是正确的)然后从中获取它,但它仍然无法正常工作。我可以在本地数据库中创建一个新表并保存数据,但在这个用例中没有必要。

你对如何返回正确的值有什么建议吗?我在这里做错了什么?

干杯

【问题讨论】:

  • 从云端获取数据是一个异步调用。那么当它进行 API 调用时会发生什么,返回 vNumber 将给出 0(默认 Int 值)。一旦你在 api 调用后获得价值,然后消费它。
  • @KishanMaurya 嗨,在 try/catch 中,我得到了正确的值,我可以在 Toast 中使用它,将它放在 textView 中或将其分配给另一个变量,但是一旦我离开try/catch 块我得到 0,即使我使用新的 vars 或 getText() 方法。我唯一能想到的 rn 就是在我从通话中得到它时将它保存到数据库中,但我试图避免这种情况
  • 这是代码的正确行为。您能否提供有关您在返回后使用 vNumber 所做的事情的背景信息?当代码流到达 try catch 块时,您将获得正确的值。所以你只能从这里使用它。吐司、文本视图或存储在任何地方。我认为您正在调用此 getVersionNumber() ,由于 volley api 调用的异步性质,它会给您 0。
  • @KishanMaurya 我将它与存储在共享首选项中的号码进行比较,在应用程序打开时,如果号码相同,则没有进一步的操作,但如果本地号码低于获取的号码number 我获取了一些额外的数据。你建议我做什么来返回正确的值?因为就像你说的,目前我只能在 try catch 中使用它。
  • 是的,在您从 api 调用中获得价值后进行比较。即在这一行之后 vNumber = jsonObject.getInt("version"); // 为您的操作添加一些方法.. 进行同步 API 调用(不推荐)或在从 api 调用中获取值后执行任何操作。

标签: java android android-volley


【解决方案1】:
public void fetchVersionNumber() {

    StringRequest stringRequest = new StringRequest(Request.Method.POST, GET_VERSION_NUMBER,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject object = new JSONObject(response);
                        JSONArray jsonArray = object.getJSONArray("result");
                        JSONObject jsonObject = jsonArray.getJSONObject(0);

                        vNumber = jsonObject.getInt("version");
                        compareAndUpdate(vNumber)

                    } catch (JSONException e) {
                        e.printStackTrace();
                        Log.d(TAG, "JSONException: " + e);
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d(TAG, "VolleyError: " + error);
                }
            });

    RequestQueue requestQueue = Volley.newRequestQueue(context);
    requestQueue.add(stringRequest);
}

public void compareAndUpdate(int vNumber){

//compare and do your operation
// Get from sharedPref and compare
}

【讨论】:

    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2021-12-20
    • 2022-06-14
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多