【问题标题】:Boolean value inside OnResponse Android VolleyOnResponse Android Volley 中的布尔值
【发布时间】:2021-07-31 04:02:40
【问题描述】:

我是 android 新手,我在尝试根据 OnResponse for Android Volley 中的响应返回布尔值时遇到问题。每当来自 OnResponse 的 json 响应等于某个值时,我想返回一个布尔值,但是当我尝试这样做时,我意识到布尔值没有根据代码设置(可能是因为线程。)。这是我想整合它的地方:

 final JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, key, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                      //here I obtain the json object and based on it I want to make the boolean false or true

                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (error.networkResponse.statusCode == 404) {

                  ....
                }
            }


        }) {

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
     
            }

            @Override
            protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
            
        };
        mRequestQueue.add(request);

        return boolean;
    }

【问题讨论】:

标签: android json android-volley


【解决方案1】:

当您编写网络代码时(在本例中,使用 volley),您的代码不会按顺序执行。也就是说,当您进行网络呼叫时,响应可能会在 2 秒之后出现。所以这些代码是异步的。在这些情况下,我们使用回调。 我认为您正在尝试做这样的事情:

boolean result = getNetworkResult(); // suppose, your code is inside getNetworkResult() method
if(result == true) {
 Log.e(TAG, "Do something on success");
}else{
 Log.e(TAG, "Do something on failure");
}

由于您给定的代码是异步的,它不会以这种方式工作。这就是我们使用回调/监听器的原因。因此,您的代码将如下所示:

 final JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, key, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                      //here I obtain the json object and based on it I want to make the boolean false or true
                    // just simply write your logic inside here
                    boolean result; // your conditions
                    if(result == true) {
                       Log.e(TAG, "Do something on success");   // <----- Look here
                   }else{
                       Log.e(TAG, "Do something on failure"); // <----- Look here
                    }

                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (error.networkResponse.statusCode == 404) {

                  ....
                }
            }


        }) {

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
     
            }

            @Override
            protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
            
        };
        mRequestQueue.add(request);

        //  return boolean;  // <-- this won't work, so I am commenting it out
    }

现在,如果您真的想编写“看起来”像顺序的代码(但实际上它实际上是异步的),那么您可以尝试 kotlin 协程。我找到了这个stackoverflow answer,它展示了如何将协程与 volley 一起使用。请检查一下。

编辑

根据您的评论,我认为您应该以这种方式编写代码: 假设您有 2 个活动:MainActivityDetailsActivity。不要在MainActivity 中保留布尔变量,而是尝试将布尔值传递给DetailsActivity

所以代码可以是这样的:

public class MainActivity extends AppCompatActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   
    final JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, key, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                      // the new logic

                      if(response.toString().contains("farewall to arms")) {
                        // open new activity
Intent intent = new Intent(this, DetailsActivity.class);
        intent.putExtra("YOUR_BOOLEAN_VALUE", true);  // Here we are passing the boolean result
        intent.putExtra("SOME_STRING", response.toString());
        // pass more variables that you need...
        startActivityForResult(intent, 8080);
                      }

                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (error.networkResponse.statusCode == 404) {

                  ....
                }
            }


        }) {

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {

            }

            @Override
            protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {

        };
        mRequestQueue.add(request);

        //  return boolean;  // <-- this won't work, so I am commenting it out
    }

  }
}

现在在DetailsActivity:

class DetailsActivity extends AppCompatActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

 Boolean yourBool = getIntent().getExtras().getBoolean("YOUR_BOOLEAN_VALUE");
String yourResponse = getIntent().getExtras().getString("SOME_STRING");

         // now inside your for loop
         for(int i=0; i<10; i++) {
            if(yourBool == true) { break;}
         }
    }
}

【讨论】:

  • 谢谢,但我仍然有一些问题,因为我看不出如何解决我使用这个的问题:inside on response : if ((checkSimilarity(jsonObj.getString('title' ))
  • 函数内部的布尔值不起作用。但是如果你在你的类中创建了一个布尔变量,那么你就可以访问那个布尔变量。那是class YourActivity{ private boolean someBool; /*you should be able to access this*/ } 。顺便说一句,你能告诉我你真正想要做什么吗?也许重新组织你的逻辑是个好主意。
  • 我也尝试将布尔值添加到类中,但我猜由于它是异步的,线程会混淆布尔值并且不会在正确的时间显示正确的值。好吧,每次 json 对象有一些我正在寻找的属性时,我都会将布尔值设置为 true,并存储该 json 对象,同时打开另一个包含该对象详细信息的活动。例如,每次 json 对象的标题是“告别武器”时,我都会保留那本书并打开有关它的详细信息,并将布尔值设置为 true。我需要布尔值,因为我在另一个活动中有一个 for
  • ... 使用 volley 调用调用函数,但使用与字符串列表不同的键字符串。如果带有字符串的书是通过 volley 调用找到的(布尔值是 true),那么我想从 for 中中断: (String key:listOfString) { if( parseJSONObject()){ break; } }
  • 我已经更新了我的答案。请检查并告诉我。
猜你喜欢
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2018-12-15
相关资源
最近更新 更多