2016-09-21 18 views
0

我有一个通过set方法更新全局变量的问题。总之,情况如下:与齐射同步请求android

  • 使用一个类(SessionHandler是这个类的名称)来存储有关当前用户会话(登录)信息,然后在其中一套方法,它设置了我如果用户登录,则为布尔值为true,否则为false。该变量被初始化为FALSE。

  • 使用库实现登录逻辑与Facebook,谷歌加,个性化登录。在这个类中有一个方法(customSignin),它根据登录是否成功返回一个布尔值。

     @Override   
        public boolean customSignin(SmartUser smartUser) { 
    
        params = new ArrayList<>(); 
        params.add(smartUser.getUsername()); 
        params.add(smartUser.getPassword()); 
    
        StringRequest strReq = new LoginStringRequest().getStringRequest(params); 
        AppController.getInstance().addToRequestQueue(strReq); 
    
    
        if(SessionHandler.logged){ 
         return true; 
        } else { 
         return false; 
        } 
    
    } 
    

然后TRUE =登录的用户,FALSE =用户没有登录。显然,如果用户在数据库中存在,该值必须被设置为真。 问题是,您可以从发布的代码中看到: 在此方法中,我打电话给另一个类,负责检查输入的值(用户名,密码)是否正确,检查数据库,要做到这一点使用库Volley,问题是作为一个异步任务,在Volley onResponse方法内,如果数据是正确的,通过set方法将septum设置为TRUE,则布尔变量LOGGED的值为true。 我稍后需要在第一个(customSignin)的方法中验证布尔变量的值,该值始终设置为FALSE,即使登录信息是正确的。 (然后继续从教育IF开始检查布尔值)。 这是凌空类的代码:

Code of Volley request

现在想知道如果任何人都可以告诉我,我怎么能解决这个问题,你能避免使用同步任务来解决问题?特别是,它通过排球给我,如果用户存在于数据库中,则设置为true,然后继续在customSignin方法中运行。

对不起,不幸的是使用翻译,感谢那些谁会知道如何帮助我。

回答

0

@Applefriend根据描述我的理解是,CustomSignIn方法中的代码使用volley异步地进行网络调用,这将在请求完成后稍后设置会话信息。

所以,当你说

AppController.getInstance().addToRequestQueue(strReq); // Dispatch async call 

if(SessionHandler.logged){ // This happens in the current UI thread (which be returning the default value or an exception 
    return true; 
} else { 
    return false; 
} 

既然是用户登录功能,为什么你想在一个异步的方式?更好的方法是: 显示一个不确定的进度对话框并同步进行调用并返回值。

如果我的理解错误,请纠正我。

+0

我有同样的想法使用同步请求返回值。但是我用了FutureRequest,结果是TimeoutException。 – Applefriend

+0

这是实现同步请求的方法[链接](http://s13.postimg.org/4n6573xw7/Schermata_2016_09_22_alle_21_24_00.png) – Applefriend