Part 1 源代码预览
// 将 fullBackResponse 中的 stuID passwd 储存为字符串形式
// state 账号状态以 int 形式储存,0代表账号未注销,1代表账号已注销
// 已注销的账号不能登录,需要返回一个提示
String LoginResponse_stuID = String.valueOf(fullBackResponse.getData().getStuID());
String LoginResponse_passwd = fullBackResponse.getData().getPasswd();
int LoginResponse_state = fullBackResponse.getData().getState();
// showToastSync(res);
if (Objects.equals(LoginResponse_stuID,stuID)
&& Objects.equals(LoginResponse_passwd,password)
&& LoginResponse_state == 0){
// 如果返回的 账号、密码与输入的相同以及状态码为0 时,可以进行登录操作
// 将 stuID 以字符串形式保存到 SharedPreference 的 sysLoginStuID 当中
SaveStringToSharedPreferences(
SharedPreferenceDefault.SharedPreferenceSysConfName,
SharedPreferenceDefault.SharedPreferenceSysConfigLoginStuID,
LoginResponse_stuID
);
// 将登录状态保存到 SharedPreference 的 sysLoginState 当中
SaveIntToSharedPreferences(
SharedPreferenceDefault.SharedPreferenceSysConfName,
SharedPreferenceDefault.SharedPreferenceSysConfLoginState,
LoginResponse_state
);
// showToastSync(getString(R.string.Warning_loginSuccess));
// 跳转到主页面
navigateTo(Home.class,true);
delayEndActivity(1000);
}
Part 2 问题的发现
在倒数第三行有一个 navigateTo
的页面跳转函数,这个在BaseActivity
里的函数封装了 Intent
方法,代码如下:
public void navigateTo(Class cls,boolean bool){
// 跳转页面
Intent in = new Intent(mContext,cls);
if(bool){
Log.e("Activity:","StartActivity");
startActivity(in, ActivityOptions.makeSceneTransitionAnimation((Activity) mContext).toBundle());
}else{
startActivity(in);
}
}
但是出现了一个问题,程序停在startActivity
这个地方,也就是页面并没有跳转。
查看 Logcat 也没有提示。
我把页面跳转这个代码单独提取出来,注释掉其他代码,再次运行,出现了下面的这个报错:
根据以往的经验,可能是异步的问题,参考这篇文章,证实了我的想法。
Part 3 解决后的代码
// 将 fullBackResponse 中的 stuID passwd 储存为字符串形式
// state 账号状态以 int 形式储存,0代表账号未注销,1代表账号已注销
// 已注销的账号不能登录,需要返回一个提示
String LoginResponse_stuID = String.valueOf(fullBackResponse.getData().getStuID());
String LoginResponse_passwd = fullBackResponse.getData().getPasswd();
int LoginResponse_state = fullBackResponse.getData().getState();
// showToastSync(res);
if (Objects.equals(LoginResponse_stuID,stuID)
&& Objects.equals(LoginResponse_passwd,password)
&& LoginResponse_state == 0){
// 如果返回的 账号、密码与输入的相同以及状态码为0 时,可以进行登录操作
// 这里使用 Looper ,开启异步
Looper.prepare();
// 将 stuID 以字符串形式保存到 SharedPreference 的 sysLoginStuID 当中
SaveStringToSharedPreferences(
SharedPreferenceDefault.SharedPreferenceSysConfName,
SharedPreferenceDefault.SharedPreferenceSysConfigLoginStuID,
LoginResponse_stuID
);
// 将登录状态保存到 SharedPreference 的 sysLoginState 当中
SaveIntToSharedPreferences(
SharedPreferenceDefault.SharedPreferenceSysConfName,
SharedPreferenceDefault.SharedPreferenceSysConfLoginState,
LoginResponse_state
);
// showToastSync(getString(R.string.Warning_loginSuccess));
// 跳转到主页面
navigateTo(Home.class,true);
delayEndActivity(1000);
Looper.loop();
}
在 SharedPreference
保存操作和跳转页面的代码前后添加了下面的代码
Looper.prepare();
{
Your Code}
Looper.loop();