android多线程中更新ui,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= 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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值