我通过set方法更新全局变量时遇到问题。简而言之,情况如下:
使用类(SessionHandler是此类的名称)来存储有关当前用户会话的信息(已登录),然后在set方法中,如果用户已记录,则会将布尔值设置为true in,否则为false。该变量初始化为FALSE。
使用库实现登录逻辑与facebook,google plus,个性化登录。在这个类中有一个方法(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 =用户未登录。显然,如果用户存在于数据库中,则该值必须设置为true。 问题是,从发布的代码中可以看出: 在这个方法中,我调用另一个类来负责检查输入的值(用户名,密码)是否正确,对数据库进行检查,这样做使用库Volley,问题在于一个异步任务,在Volley onResponse方法中,如果数据是正确的隔垫,则通过set方法将其设置为布尔变量LOGGED的值。 我稍后需要在第一个(customSignin)的方法中验证布尔变量的值,即使登录信息正确,也始终将其设置为FALSE。 (然后从教育IF开始继续检查布尔值)。 这是凌空类的代码:
现在想知道是否有人能告诉我如何解决这个问题,你可以避免使用同步任务来解决这个问题吗?特别是,它通过排球,如果用户存在于数据库中,然后继续在customSignin方法中运行,则设置为true。
抱歉瑕疵,不幸的是使用翻译,感谢那些知道如何帮助我的人。
答案 0 :(得分: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;
}
由于它是用户登录功能,为什么要以异步方式使用它?更好的方法是: 显示一个不确定的进度对话框并同步进行调用并返回值。
如果我的理解是错误的,请纠正我。