`
ch_kexin
  • 浏览: 899421 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

Android 更新UI方法的深度解析

 
阅读更多

1. Handler

public class SecondActivity extends Activity {  
    private static final int MSG_WHAT = 101;  
    TextView tv;  
    Button btn;  
    private MyHadler mHandler1;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main2);  
        tv = (TextView) findViewById(R.id.tv);  
        btn = (Button) findViewById(R.id.btn);  
        mHandler1 = new MyHadler();  
        btn.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View view) {  
                updateUi();  
            }  
        });  
    }  
  
    class MyHadler extends Handler {  
        @Override  
        public void handleMessage(Message msg) {  
            super.handleMessage(msg);  
            switch (msg.what) {  
                case MSG_WHAT:  
                    String str = (String) msg.obj;  
                    tv.setText(str);  
            }  
        }  
    };  
  
    /** 
     * 
     */  
    private void updateUi1() {  
        new Thread() {  
            @Override  
            public void run() {  
                try {  
                    Thread.sleep(5 * 1000);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
                Message message = mHandler1.obtainMessage();  
                message.what = MSG_WHAT;  
                message.obj = "来自子线程的数据";  
                mHandler1.sendMessage(message);  
            }  
        }.start();  
    }  
}  

2.Handler的post()方法

private void updateUi2() {  
    new Thread() {  
        @Override  
        public void run() {  
            try {  
                Thread.sleep(5 * 1000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            mHandler1.post(new Runnable() {  
                @Override  
                public void run() {  
                    tv.setText(" Handler.post更新UI");  
                }  
            });  
        }  
    }.start();  
}  

看看post()方法的源码

public final boolean post(Runnable r)  
   {  
      return  sendMessageDelayed(getPostMessage(r), 0);  
   }  

该方法调用了sendMessageDelayed(getPostMessage(r), 0)发送一条消息,下面首先看看 getPostMessage()方法

private static Message getPostMessage(Runnable r) {  
       Message m = Message.obtain();  
       m.callback = r;  
       return m;  
   } 

getPostMessage()方法是将Runnable对象转化为消息对象Message的callback属性。而sendMessageDelayed()方法就不多说 了,又回到Handler的处理机制了。

Handler的dispatchMessage()方法

public void dispatchMessage(Message msg) {  
      if (msg.callback != null) {  
          handleCallback(msg);  
      } else {  
          if (mCallback != null) {  
              if (mCallback.handleMessage(msg)) {  
                  return;  
              }  
          }  
          handleMessage(msg);  
      }  
  }  

可以看到,首先判断如果message的callback不等于null,则调用Handler的handleCallback()方法,否则调用Handler对象的handleMessage()方法。

3. Activity的runOnUiThread()方法

/** 
    * 通过runOnUiThread更新UI 
    */  
   private void updateUi3(){  
       new  Thread(){  
           @Override  
           public void run() {  
               try {  
                   Thread.sleep(3*1000);  
               } catch (InterruptedException e) {  
                   e.printStackTrace();  
               }  
               runOnUiThread(new Runnable() {  
                 @Override  
                 public void run() {  
                     tv.setText("runOnUiThread更新UI");  
                 }  
             });  
  
           }  
       }.start();  
   }  

 看看runOnUiThread()方法的源码

public final void runOnUiThread(Runnable action) {  
      if (Thread.currentThread() != mUiThread) {  
          mHandler.post(action);  
      } else {  
          action.run();  
      }  
  }  

4.View.post(Runnable r)方法

private void updateUi4(){  
       new Thread(){  
           @Override  
           public void run() {  
               super.run();  
               tv.post(new Runnable() {  
                   @Override  
                   public void run() {  
                       tv.setText("view post更新UI");  
                   }  
               });  
           }  
       }.start();  
   }  

 再来看看post()方法的源码

public boolean post(Runnable action) {  
    final AttachInfo attachInfo = mAttachInfo;  
    if (attachInfo != null) {  
        return attachInfo.mHandler.post(action);  
    }  
  
    // Postpone the runnable until we know on which thread it needs to run.  
    // Assume that the runnable will be successfully placed after attach.  
    getRunQueue().post(action);  
    return true;  
}  

 该方法还是调用了Handler的post()方法。Handler的post()方法很重要哦!

 

 

 

 

分享到:
评论

相关推荐

    android UI设计(Android UI Fundamentals)

    因此,掌握Android UI设计的核心原则和实践方法,对于任何希望在Android平台上开发高质量应用的个人或团队来说,都是至关重要的。 ### 关键知识点解析 #### 1. Android设计语言:Material Design Material Design...

    Android上解析24位深度Bitmap文件示例

    在Android中处理24位深度的Bitmap文件,涉及到内存管理、解码以及显示等多个环节,这里我们将详细探讨这些知识点。 1. **内存管理**:由于24位深度的Bitmap文件占用内存较大,处理不当可能导致内存溢出。Android...

    Android_UI设计指导

    ### Android UI设计指导 #### 一、引言 随着移动互联网的发展,用户界面(UI)设计已成为应用程序成功的关键因素之一。良好的UI设计不仅能够提升用户体验,还能直接影响应用的市场表现。Google在其官方开发者博客中...

    Android自定义View实例:深度剖析 水晶/水滴 波浪球 实现步骤详解

    在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有表现力的UI元素,提升用户体验。本文将深度剖析如何实现一个名为“水晶/水滴 波浪球”的自定义View,并通过详细步骤讲解,帮助你掌握...

    android UI开发专题

    以下是对这些核心知识点的深度解析。 #### 一、资源管理:`android.content.res.Resources` 在Android开发中,`Resources`类扮演着资源管理者的角色,它负责访问应用中的各类资源,如raw asset文件、颜色定义、...

    Android源码设计模式解析与实战.PDF(完整版)

    综上所述,Android源码设计模式解析与实战不仅是一本关于技术实现的书籍,更是一次深度学习如何优化代码结构、提高程序效率的过程。通过上述对几种典型设计模式的详细介绍,希望能帮助读者更好地理解和运用这些模式...

    Android 性能优化之UI优化源码

    本文将深入探讨Android UI优化的源码层面,帮助开发者更好地理解并实现高效的UI更新与渲染。 首先,我们要明白Android UI的基本架构是基于View和ViewGroup的层次结构。每个View代表屏幕上的一个元素,而ViewGroup则...

    Android与ios的优劣深度解析![收集].pdf

    根据给定的内容片段,可以提取以下知识点来解析Android与iOS两大移动操作系统的优劣: 1. 应用生态与分发平台:文中提到了App Store和Android Market(后来更名为Google Play商店),这是两个平台在应用分发上的...

    07大话企业级Android开发_UI(上)

    【大话企业级Android开发_UI(上)】章节主要涵盖了Android应用开发中的用户界面(UI)设计基础。在Android平台上,UI设计对于构建用户友好、交互性强的应用至关重要。本章节可能涉及以下知识点: 1. **UI概述** - *...

    UI底层源码深度剖析手册1

    `setContentView`的过程涉及了Android系统如何将UI设计文件解析并呈现到屏幕的细节。理解这一过程对于开发者来说至关重要,因为这可以帮助优化布局加载性能,避免不必要的内存消耗,提高应用的用户体验。通过对源码...

    Android-微信ui版的PhotoPicker最大程度地简化使用

    《Android开发:微信UI版PhotoPicker的深度解析与实践》 在移动应用开发领域,尤其是在Android平台上,图片的加载和展示是用户体验中的重要一环。微信作为全球最受欢迎的社交应用之一,其用户界面设计和功能实现...

    Android应用源码之高仿360云盘UI.rar

    《Android应用源码解析:深度剖析高仿360云盘UI》 在移动开发领域,Android平台以其开源、自由的特性吸引了众多开发者。而360云盘作为一款备受欢迎的云存储服务,其用户界面(UI)设计独特且用户体验优秀。本篇文章...

    Android UI-最新版糗事百科布局,带简单数据加载

    在Android开发中,UI设计是至关重要的一环,它直接影响到用户对应用的第一印象和使用体验。本项目"Android UI-最新版糗事百科布局,带简单数据加载"旨在提供一个仿照最新版糗事百科应用的界面布局,并实现数据加载...

    android FFT 获取音频的频率并实时显示

    - 更新UI:在主线程中更新图形,使用计算出的频率强度更新图表。 6. **注意点**: - 填充零值:如果音频数据不足FFT大小,通常需要填充零值以满足FFT的要求。 - 均衡处理:为了避免低频部分占据过多显示空间,...

    Android-framework详细分析

    《Android Framework深度解析》 Android Framework是Android操作系统的核心组成部分,它是Android应用开发的基础,负责提供应用程序接口(API)以及系统服务。在这个详细分析中,我们将深入探讨Android Framework的...

    Android Touch事件传递机制解析

    在Android系统中,触摸事件(Touch Event)是用户与设备交互的重要方式,它涉及到了UI控件的响应和处理。本文将深入解析Android的Touch事件传递机制,帮助开发者理解这一核心概念。 首先,我们了解下Android中的...

    android 4.0 桌面时钟源码DeskClock

    《Android 4.0 桌面时钟源码DeskClock深度解析》 在Android操作系统中,DeskClock是一款内置的桌面时钟应用,它集成了多种功能,包括时钟、闹钟、计时器和秒表。对于开发者来说,深入理解DeskClock的源码能够帮助...

Global site tag (gtag.js) - Google Analytics