Android开发:Can't create handler inside thread that has not线程问题解决
时间:2020-03-24
本文章向大家介绍Android开发:Can't create handler inside thread that has not线程问题解决,主要包括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();
原文地址:https://www.cnblogs.com/guobin-/p/12561477.html
- 手把手教 Vue-环境搭建
- 马化腾:通向互联网未来的七个路标
- 微信小程序,让生活不一样
- rsync+inotify实时同步环境部署记录
- 常用rsync命令操作梳理
- 无人驾驶系列——深度学习笔记:Tensorflow基本概念
- Android Fragment应用实战
- c#4.0中的不变(invariant)、协变(covariant)、逆变(contravariant)小记
- 用于.NET的可移植HTTP客户端
- 我是如何利用CSRF Get DedeCms Shell的
- asp.net webform中submit按钮使用不当很容易犯的一个错误
- 使用代码为textview设置drawableLeft
- 使用 ASP.NET Web API 构建超媒体 Web API
- Robert Xiao:下一个触点在哪里?
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android编程实现切换imageView的方法分析
- 猿实战20——商品发布之sku与笛卡尔乘积的那些事儿
- 浅谈Android单元测试的作用以及简单示例
- linux上传并配置jdk和tomcat的教程详解
- Android SQLite事务处理结合Listview列表显示功能示例
- Android开发之如何自定义数字键盘详解
- 在Android上实现HttpServer的示例代码
- Linux /etc/network/interfaces配置接口方法
- Android中Service和Activity相互通信示例代码
- Android编程实现定时发短信功能示例
- Android实现新浪微博一键分享的实例代码
- Android实现常见的验证码输入框实例代码
- Android实现加载状态视图切换效果
- Retrofit + OkHttp缓存处理的示例代码
- Android图片实现压缩处理的实例代码