Android开发:Can't create handler inside thread that has not线程问题解决

一、问题如下

  1、报错内容:Only the original thread that created a view hierarchy can touch its views.Only the original thread that created a view hierarchy can touch its views.

  2、问题分析:在Android中不允许Activity里新启动的线程访问该Activity里的UI组件,Android中的UI是线程不安全的, 所有的更新UI操作都必须要在主线程中完成,而不能在新开的子线程中操作。

  3、问题背景:

  在从Android客户端向服务器发送数据,并在服务器端处理、返回数据接受之后,要显示在客户端的界面上。

  由于网络相关的操作无法在主线程进行,只能通过新线程完成这个操作,而要显示在客户端的话,又必须要通过UI线程才能完成,因此就会报出上述错误。

  这次就是在用Toast显示服务器端返回的数据时报的这个错。

二、问题解决

  1、若想在异步线程前执行某些UI操作,比如更新progressBar进度条等操作,这种情况适合用runOnUiThread方法。
  2、若想在线程中执行UI操作,还是要用Handler:

new Thread(new Runnable() { public void run() { try { URL url = new URL(strUrl); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); //设置输入流采用字节流 urlConnection.setDoInput(true); //设置输出流采用字节流 urlConnection.setDoOutput(true); urlConnection.setRequestMethod("POST"); //设置缓存 urlConnection.setUseCaches(false); //设置meta参数 urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); urlConnection.setRequestProperty("Charset", "utf-8"); //连接往服务器端发送消息 urlConnection.connect(); DataOutputStream dop = new DataOutputStream(urlConnection.getOutputStream()); dop.writeBytes("username=" + URLEncoder.encode(username, "utf-8") + "&password=" + URLEncoder.encode(password, "utf-8")); dop.flush(); dop.close(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String result = ""; String readLine = null; while ((readLine = bufferedReader.readLine()) != null) { result += readLine; } bufferedReader.close(); urlConnection.disconnect(); message=URLDecoder.decode(result, "utf-8").toString(); Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { Gson gson=new Gson(); Message m=gson.fromJson(message,Message.class); Toast.makeText(LoginActivity.this, m.getMessage(), Toast.LENGTH_LONG).show(); } }); } catch (Exception e) { e.printStackTrace(); } } }).start();

 


__EOF__

本文作者我命倾尘
本文链接https://www.cnblogs.com/guobin-/p/12561477.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   我命倾尘  阅读(4285)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2019-03-24 CoCos2dx开发:更换导出的app名称和图标
2019-03-24 CoCos2dx开发:PC端调试运行正常但打包apk文件后在手机上点击闪退
点击右上角即可分享
微信分享提示