今天在做练习时,在一个新开启的线程中调用“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= newJSONObject(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(newRunnable() {public voidrun() {try{

JSONObject jsonObject = newJSONObject(

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 = newHandler() {

@Overridepublic voidhandleMessage(Message msg) {if (msg.obj == null) {

Toast.makeText(MainActivity.this, "消息传递失败", Toast.LENGTH_SHORT)

.show();return;

}

String return_src=(String) msg.obj;try{

JSONObject jsonObject= newJSONObject(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=newMessage();

msg.obj=return_src;

handler.sendMessage(msg);

android多线程中更新ui,Android 在子线程中更新UI相关推荐

  1. [Java][Android] 多线程同步-主线程等待全部子线程完毕案例

    有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...

  2. Android子线程中更新UI的4种方法

    方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...

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

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

  4. Android 为什么不能在子线程中直接更新UI

    1.现象 在子线程中直接更新UI就会crash,报错如下: android.view.ViewRootImpl$CalledFromWrongThreadException:Only the orig ...

  5. android 线程 界面,android开发教程之子线程中更新界面

    每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间 ...

  6. Android中Handler的使用方法——在子线程中更新界面

    本文主要介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Ha ...

  7. Android利用Looper在子线程中改变UI

    MainActivity如下: package cn.testlooper; import android.app.Activity; import android.os.Bundle; import ...

  8. 为什么不能在子线程中更新UI

    首先声明一点:子线程里面是可以更新UI的--创建一个空白的Activity,在其xml文件中放一个空白TextView,Java代码如下: @Override protected void onCre ...

  9. 为什么子线程中不能直接更新UI

    点击上方"dotNET全栈开发","设为星标" 加"星标★",每天11.50,好文必达 全文约4000字,预计阅读时间8分钟 当初有同事就碰 ...

  10. 【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

    文章目录 一.判定当前线程是否是主线程 二.子线程中执行主线程方法 三.主线程中执行子线程方法 一.判定当前线程是否是主线程 在 Android 中 , 如果要判定当前线程是否是主线程 , 可以使用如 ...

最新文章

  1. 给CentOS添加第三方源
  2. Cannot send session cache limiter - headers already sent错误解决方法
  3. 47K Star 的SpringBoot+MyBatis+docker电商项目,附带超详细的文档!
  4. MongoDB学习之(一)安装
  5. java佳沃维洛奇,新品速递:JAVA 双雄耀世登场
  6. oracle database 12cr2 使用 dbms_stat 采集统计信息
  7. 进程与线程的超级简单形象解释
  8. android studio json插件_热门Android Studio 插件,这里是Top 20
  9. linux grep命令参数及用法详解---linux管道命令grep
  10. 【转载】IDEA中Git的更新/提交/还原方法
  11. 使用mprotect系统调用来调试内存问题:memalign,aligned_alloc
  12. Data truncation: Data too long for column错误分析
  13. Markdown 编辑器 Editor.md 图片上传使用
  14. 关于MAPGIS文件转CAD文件的问题处理
  15. CF868F 分治优化dp
  16. 力荐 50 个最实用的免费机器学习数据集
  17. 软件行业的税收优惠政策包含哪些
  18. Java几种设计模式
  19. python截取视频_python+ffmpeg截取视频段
  20. linux 宕机 内存,Linux内存使用高,触发系统宕机

热门文章

  1. codis实现redis分片和在线扩展
  2. 分析一个文本文件中各个单词出现的频率,把频率最高的10个词打印出来
  3. 黄聪:Python初始化系统变量设置
  4. gcc g++ 参数
  5. PlusWell FileMirror软件产品简介
  6. js事件流 事件捕获 及时间冒泡详解
  7. AngularJS中$apply
  8. LuaStudio 9.27 去10分钟退出暗桩板
  9. 【设计模式和面向对象设计】拾零(持续更新,个人零散笔记)
  10. java流意外结束_java – POI – null之后的文件意外结束