android中如何实现UI的实时更新
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android中如何实现UI的实时更新相关的知识,希望对你有一定的参考价值。
1、在主线程中启动一个子线程
首先,我们需要在主线程中启动一个子线程,这个比较简单,直接在MainActivity的onCreate()方法中调用如下方法即可:
new Thread(mRunnable).start();2、在子线程中发送Message给Handler
在创建子线程时,我们使用了Runnable接口对象mRunnable。这里,只需要实现Runnable接口,并重写该接口的run()方法,在run()方法中实现每1秒发送一条Message给Handler即可。具体实现方法如下:
/** Function : 实现run()方法,每1秒发送一条Message给Handler
*/
private Runnable mRunnable = new Runnable()
public void run()
while(true)
try
Thread.sleep(1000);
mHandler.sendMessage(mHandler.obtainMessage());
catch (InterruptedException e)
e.printStackTrace();
;
3、Handler接收Message通知
最后,我们创建一个Handler对象,用来接收Message通知。在收到Message通知后,完成刷新UI的操作即可。具体实现方法如下:
/** Function : 实现handleMessage()方法,用于接收Message,刷新UI
*/
private Handler mHandler = new Handler()
public void handleMessage(Message msg)
super.handleMessage(msg);
refreshUI();
;
4、刷新UI
由以上的代码可以看出,刷新UI的操作,我们是放在refreshUI()方法中来完成的。refreshUI()方法的实现也很简单,调用HttpUtils工具类中的getInputStream()方法,获得图1所示Web工程的页面内容输入流,再将该输入流转化为字符串,放入TextView控件中进行显示即可。具体实现方法如下:
/** Function : 刷新UI
*/
private void refreshUI()
try
InputStream inputStream = HttpUtils.getInputStream();
String resultData = HttpUtils.getResultData(inputStream);
mTextView.setText(resultData);
catch (IOException e)
e.printStackTrace();
参考技术A 不知道,你可以百度看看
Android 子线程更新UI 异常
众所周知,Android是不可以在子线程中直接更新UI的,需要借助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runnable)将更新的代码切入到主线程中去实现UI更新。
我们来试一下,在Activity的 onCreate中直接在新线程中去更新一个TextView的文本,结果发现,WHAT?竟然没有抛出异常,更新也成功了?
这是因为在onCreate中尚未完成View的绘制,此时TextView中有个变量mLayout仍为null,setText时不执行重绘,没有运行到抛出线程异常的代码,但是相应的text却变化了。在Activity分发子View的Layout后,绘制的时变化后的text,故不抛出异常。其他View如ImageView也有类似现象出现。
如果在textview.getViewTreeObserver().addOnGlobalLayoutListener(OnGlobalLayoutListener listener)中添加监听绘制完毕的事件,然后再在子线程中更新UI,则会抛出异常。
归根结底,不能钻这个空子,不优美、不安全!
以上是关于android中如何实现UI的实时更新的主要内容,如果未能解决你的问题,请参考以下文章
如何从 IntentService 收集信息并更新 Android UI
如何在Android开发中用AsyncTask异步更新UI界面