Android 开发 Can‘t create handler inside thread Thread ... that has not called Looper.prepare() 的解决


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();

猜你喜欢

转载自blog.csdn.net/qq_17790209/article/details/126948869
今日推荐