Android 在子线程中更新UI
今天在做练习时,在一个新开启的线程中调用“Toast.makeText(MainActivity.this, "登陆成功",Toast.LENGTH_SHORT).show();”
报错为:Can't create handler inside thread that has not called Looper.prepare()
在新线程中添加Looper.prepare();和Looper.loop();即可。
示例代码段:(该代码在新开的线程中)
Looper.prepare();
JSONObject jsonObject = new JSONObject(return_src);
System.out.println("json:"
+ jsonObject.getString("result"));
if (jsonObject.getString("result").equals("ok")) {
Toast.makeText(MainActivity.this, "登陆成功",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "登陆失败",
Toast.LENGTH_SHORT).show();
}
Looper.loop();
这个错误的根本关键在于:在子线程中执行了更新UI的操作,就如使用了Toast。
那么,在子线程中执行更新UI操作该怎么做呢?
有三个方法:
- 在新线程中添加Looper.prepare();和Looper.loop();,在两者之间执行你想要的操作。(有网友说这种办法会终止,子线程之后的代码,本人没尝试过。)
- 在子线程中定义runOnUiThread()来执行在UI的改变操作。
- 在UI线程中定义handler和使用message。
我们用这三种方式来实现同一段代码:
第一种:(即上面已贴代码)
第二种:(在子线程中实现以下代码)
runOnUiThread(new Runnable() {
public void run() {
try {
JSONObject jsonObject = new JSONObject(
return_src);
System.out.println("json:"
+ jsonObject.getString("result"));
if (jsonObject.getString("result").equals(
"ok")) {
Toast.makeText(MainActivity.this,
"登陆成功", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(MainActivity.this,
"登陆失败", Toast.LENGTH_SHORT)
.show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
第三种:
(在主线程中,获取消息并判断属性,再执行操作)
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.obj == null) {
Toast.makeText(MainActivity.this, "消息传递失败", Toast.LENGTH_SHORT)
.show();
return;
}
String return_src = (String) msg.obj;
try {
JSONObject jsonObject = new JSONObject(return_src);
System.out.println("json:" + jsonObject.getString("result"));
if (jsonObject.getString("result").equals("ok")) {
Toast.makeText(MainActivity.this, "登陆成功",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "登陆失败",
Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
(在子线程中,创建消息,并设置消息属性,发送消息)
return_src为需要返回的数据。
Message msg=new Message();
msg.obj=return_src;
handler.sendMessage(msg);
Android 在子线程中更新UI的更多相关文章
- Android在子线程中更新UI(二)
MainActivity如下: package cc.testui2; import android.os.Bundle; import android.view.View; import andro ...
- Android在子线程中更新UI(一)
MainActivity如下: package cc.testui1; import android.os.Bundle; import android.os.Handler; import andr ...
- Android 在子线程中更新UI的几种方法
第一种: new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { // 在这里 ...
- android 不能在子线程中更新ui的讨论和分析
问题描写叙述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是仅仅能在主线程中更改 ui.子线程要 ...
- Android多线程之(一)View.post()源码分析——在子线程中更新UI
提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来实现. ...
- 使用Handler在子线程中更新UI
Android规定仅仅能在主线程中更新UI.假设在子线程中更新UI 的话会提演示样例如以下错误:Only the original thread that created a view hierach ...
- 如何在子线程中更新UI
一:报错情况 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that creat ...
- Android开发UI之在子线程中更新UI
转自第一行代码-Android Android是不允许在子线程中进行UI操作的.在子线程中去执行耗时操作,然后根据任务的执行结果来更新相应的UI控件,需要用到Android提供的异步消息处理机制. 代 ...
- C#子线程中更新ui
本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的 ...
随机推荐
- Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
[基础知识说明] 结构原型: /* * Interface request structure used for socket * ioctl's. All interface ioctl's mu ...
- Alexander Grothendieck去世了
Alexander Grothendieck (German: [ˈɡroːtn̩diːk]; French: [ɡʁɔtɛndik]; 28 March 1928 – 13 November 201 ...
- 几种流行Webservice框架性能对比
1 摘要 开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有30多种,这对于开发者如何选择带来一定的疑惑.性能Webservice的关键要素,不同的框架性 ...
- LightOJ 1245 Harmonic Number (II) 水题
分析:一段区间的整数除法得到的结果肯定是相等的,然后找就行了,每次是循环一段区间,暴力 #include <cstdio> #include <iostream> #inclu ...
- [转]优化数据库大幅度提高Oracle的性能
几个简单的步骤大幅提高Oracle性能--我优化数据库的三板斧. 数据库优化的讨论可以说是一个永恒的主题.资深的Oracle优化人员通常会要求提出性能问题的人对数据库做一个statspack,贴出数据 ...
- Monkey的简单自动化
手机测试都逃避不了Monkey,但每次都是手动跑Monkey,自己导出包来,一条条的手动输入命令. 现在轮到我去执行这些任务,觉得很是繁琐,于是写了这个脚本,自动读取导出的包名,一键回车搞定. 代码如 ...
- leetcode—pascal triangle
1.题目描述 Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows ...
- Mac IDEA快捷键积累
切来切去:Ctrl+Tab 在打开的不同类中切换来切换去 完美代码结构:Alt+Command+L 不同编辑点跳转:Alt+Command+↔️ 快速重写:Ctrl+N 快速选择代码:Alt+Shif ...
- 微软2016校园招聘4月在线笔试 ABC
题目链接:http://hihocoder.com/contest/mstest2016april1/problems 第一题:输入N,P,W,H,代表有N段文字,每段有ai个字,每行有⌊W/S⌋个字 ...
- poj 2942--Knights of the Round Table (点的双连通分量)
做这题简直是一种折磨... 有n个骑士,骑士之间相互憎恨.给出骑士的相互憎恨的关系. 骑士要去开会,围成一圈坐,相互憎恨的骑士不能相邻.开会骑士的个数不能小于三个人.求有多少个骑士不能开会. 注意:会 ...