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的实时更新的主要内容,如果未能解决你的问题,请参考以下文章

如何实现android的垂直滑动视图UI

如何从 IntentService 收集信息并更新 Android UI

如何在Android开发中用AsyncTask异步更新UI界面

Android 高级UI设计笔记09:Android如何实现无限滚动列表

如何正确实现runOnUiThread Android

Android开发——实现子线程更新UI