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);
作者:af74776
文章出处:http://www.cnblogs.com/scetopcsa/
欢迎关注微信公众号:yilu_yiyou(一路一游),一个不仅仅是代码的世界!
如果文中有什么错误,欢迎指出。以免更多的人被误导。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
文章出处:http://www.cnblogs.com/scetopcsa/
欢迎关注微信公众号:yilu_yiyou(一路一游),一个不仅仅是代码的世界!
如果文中有什么错误,欢迎指出。以免更多的人被误导。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。