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

以后有空回来补充其中原理。

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

  

最新文章

  1. Module Zero之用户管理
  2. VR内容定制请找北京动软VR团队,长年承接VR/AR应用、游戏内容定制
  3. [转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?
  4. 解决 com.sun.*包导入错误
  5. oracle sql developer数据表注释为乱码问题---解决
  6. linux下的文件系统
  7. VC常用数据类型使用转换
  8. [转] 《高性能HTML5》读后整理的Web性能优化内容
  9. centos的常用命令
  10. Linux 经常使用 性能 检测 命令 说明
  11. 不恰当的update语句使用主键和索引导致mysql死锁
  12. $(window).on("load",function(){} 和 $(document).ready(function() {}
  13. zookeeper分布式部署方案
  14. Spring AOP 简介
  15. Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞
  16. vue elementUI enter 回车 (转载)
  17. vue重要项目的参考
  18. [UWP 自定义控件]了解模板化控件(1):基础知识
  19. eol-last的相关知识
  20. 【六】php 错误异常处理

热门文章

  1. python3.5.3rc1学习六:画图
  2. 【转】Redis常见面试题
  3. Linux下MongoDB安装和配置(二)
  4. css3/sass 样式记录
  5. 剑指Offer-14.链表中倒数第k个结点(C++/Java)
  6. 17. 抽象建模能力&发散思维能力&综合(5)
  7. array 数组
  8. 【ECNU3542】神奇的魔术(二分交互题)
  9. 快速傅立叶变换(FFT)
  10. 洛谷P3206 [HNOI2010]城市建设