2016-04-19 36 views
0

我有一个上点击监听器,并在上点击监听器,我有一个如果,否则statment,如下onResponse布尔实例变量没有被设置?

@Override 
     public void onClick(View v) { 
      postMethodRegister(); 
      System.out.println("mSuccess is set to " + mSuccess); 
      if (mSuccess) { 
       Intent login = new Intent(Login.this, MainActivity.class); 
       startActivity(login); 
      }else{ 
       Toast toast = Toast.makeText(getApplicationContext(), "Please Check your UserName or Password", Toast.LENGTH_LONG); 
       toast.setGravity(Gravity.CENTER | Gravity.CENTER_HORIZONTAL, 0, 0); 
       toast.show(); 
      } 
     } 

我也有一个布尔变量,它是默认设置为false,私人布尔mSuccess ;如果onResponse被执行,我将它设置为true,否则我将它设置为false并执行相应的响应,但由于某种原因,第一次尝试登录时它运行onResponse,但是当它到达onClick时,mSuccess被设置为错误的是什么? mSuccess是一个实例变量。

public void postMethodRegister() { 
    StringRequest request = new StringRequest(Request.Method.POST, loginUrl, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      System.out.println("On Response was thrown in Login"+response); 
      mSuccess=true; 
     } 

    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      System.out.println("Error was thrown in Login" + error.getMessage()+"and the response code is "); 
      mSuccess=false; 

     } 
    }) 

回答

1

postMethodRegister()方法发出异步请求。

所以,当你点击你的按钮onClick()被调用,然后调用postMethodRegister()。 然后postMethodRegister()发出异步网络请求,这意味着您的网络请求将在另一个线程中运行,然后您的控件将立即移动到postMethodRegister()之后的下一行,即System.out.println("mSuccess is set to " + mSuccess);。现在在这一点,因为你没有得到onResponse()的响应,所以mSuccess将保持不变(并且将是错误的)。

+0

我明白这一点很有意义!你对这个问题提出的任何快速解决方案? – eli

+0

如果在onClick()中删除了两个块,则可以在onResponse()中编写块代码,并在onErrorResponse()中编写代码。 –

+0

真的,很好的致电谢谢! – eli