Can't toast on a thread that has not called Looper.prepare()


Android開發中Can't toast on a thread that has not called Looper.prepare()問題

說一下問題出現場景:

  在一個Android項目中,利用okhttp進行網絡訪問判斷用戶輸入的賬號密碼,當用戶密碼輸錯時彈出 Toast 進行提示。

 

 

截取部分代碼如下:

  利用okhttp進行網絡訪問代碼(其中User類是用來包裝用戶名和密碼):

import com.hzau.xiaonongfu.Entity.User;
import okhttp3.*;


public class HttpUtil {
    private static final String TAG="HttpUtil";

    private static final OkHttpClient client=new OkHttpClient().newBuilder().build();



    //用戶登錄驗證
    public static void login(User user,okhttp3.Callback callback){
        //建立表單,添加需要上傳到服務器的參數
        RequestBody body=new FormBody.Builder()
                .add("username",user.getUser_name())
                .add("password",user.getPassword())
                .build();


        //發起請求
        Request request=new Request.Builder()
                .url(Address.LOGIN_ADDRESS)
                .post(body)
                .build();

        //啟動連接,enqueue()會自動開啟子線程
        client.newCall(request).enqueue(callback);
    }
}

 

在Activity中獲取返回數據:

 

HttpUtil.login(user,new okhttp3.Callback(){
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String s= Objects.requireNonNull(response.body()).string();
//判斷是否登錄成功
if(s.equals("0")){
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
}else if(s.equals("1")){
Toast.makeText(LoginActivity.this,"密碼錯誤,請檢查您的密碼!",Toast.LENGTH_SHORT).show();
}
}

@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {

}
});

 

 

 

 

這里服務器端采用php腳本的方式,賬號密碼正確就返回 0 ,錯誤就返回 1 。

 

百度了一下,說一下錯誤的原因吧:

  okhttp中 Callback 是封裝好的在子線程運行,Android是不允許在子線程中彈出 Toast 提示的,和不允許在子線程中進行 UI 操作一樣。

 

 

解決辦法:

在 Toast 前后加上一些代碼,如下:

Looper.prepare();
Toast.makeText(LoginActivity.this,"密碼錯誤,請檢查您的密碼!",Toast.LENGTH_SHORT).show();
Looper.loop();

 

以后有空回來補充其中原理。

 

 

 

吾生也有涯,而知也無涯。

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM