今天在做练习时,在一个新开启的线程中调用“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操作该怎么做呢?

有三个方法:

  1. 在新线程中添加Looper.prepare();和Looper.loop();,在两者之间执行你想要的操作。(有网友说这种办法会终止,子线程之后的代码,本人没尝试过。)
  2. 在子线程中定义runOnUiThread()来执行在UI的改变操作。
  3. 在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的更多相关文章

  1. Android在子线程中更新UI(二)

    MainActivity如下: package cc.testui2; import android.os.Bundle; import android.view.View; import andro ...

  2. Android在子线程中更新UI(一)

    MainActivity如下: package cc.testui1; import android.os.Bundle; import android.os.Handler; import andr ...

  3. Android 在子线程中更新UI的几种方法

    第一种: new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { // 在这里 ...

  4. android 不能在子线程中更新ui的讨论和分析

    问题描写叙述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是仅仅能在主线程中更改 ui.子线程要 ...

  5. Android多线程之(一)View.post()源码分析——在子线程中更新UI

    提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来实现. ...

  6. 使用Handler在子线程中更新UI

    Android规定仅仅能在主线程中更新UI.假设在子线程中更新UI 的话会提演示样例如以下错误:Only the original thread that created a view hierach ...

  7. 如何在子线程中更新UI

    一:报错情况 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that creat ...

  8. Android开发UI之在子线程中更新UI

    转自第一行代码-Android Android是不允许在子线程中进行UI操作的.在子线程中去执行耗时操作,然后根据任务的执行结果来更新相应的UI控件,需要用到Android提供的异步消息处理机制. 代 ...

  9. C#子线程中更新ui

    本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的 ...

随机推荐

  1. Nginx实现七层负载均衡配置指导

    本文描述了如何使用Nginx实现在应用层实现7层负载均衡功能,Nginx支持虚拟主机,可以按照轮询,IP哈希,URL哈希,权重方式对后端服务器做负载均衡,还支持后端服务器健康检查功能.废话不多说,详细 ...

  2. HDU5673 Robot 默慈金数

    分析: 注:然后学了一发线性筛逆元的姿势 链接:http://blog.miskcoo.com/2014/09/linear-find-all-invert #include<iostream& ...

  3. BZOJ2818: Gcd 欧拉函数求前缀和

    给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ...

  4. python中的pth文件作用

    python中有一个.pth文件,该文件的用法是: 首先xxx.pth文件里面会书写一些路径,一行一个. 将xxx.pth文件放在特定位置,则可以让python在加载模块时,读取xxx.pth中指定的 ...

  5. Storm系列(十四)架构分析之Executor-输入和输出处理

    Executor的数据 mk-executor-data函数用于定义Executor中含有的数据. Executor的输入处理 根据executor-id从Worker的:executor-recei ...

  6. 【转载】HBase 数据库检索性能优化策略

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html 高性能 HBase 数据库 本文首先介绍了 HBase 数据库基本 ...

  7. POJ2479,2593: 两段maximum-subarray问题

    虽然是两个水题,但是一次AC的感觉真心不错 这个问题算是maximum-subarray问题的升级版,不过主要算法思想不变: 1. maximum-subarray问题 maximum-subarra ...

  8. CodeForces 352C. Jeff and Rounding(贪心)

    C. Jeff and Rounding time limit per test:  1 second memory limit per test: 256 megabytes input: stan ...

  9. mybatis的$存在安全问题,为什么又不得不用?

    1.mybatis的官网关于$和#的字符串替换符号区别描述如下: http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Parameters 上面的意 ...

  10. 关于python文件转为exe文件

    一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序. py2e ...