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平台上开发高质量应用的个人或团队来说,都是至关重要的。 ### 关键知识点解析 #### 1. Android设计语言:Material Design Material Design...
在Android中处理24位深度的Bitmap文件,涉及到内存管理、解码以及显示等多个环节,这里我们将详细探讨这些知识点。 1. **内存管理**:由于24位深度的Bitmap文件占用内存较大,处理不当可能导致内存溢出。Android...
### Android UI设计指导 #### 一、引言 随着移动互联网的发展,用户界面(UI)设计已成为应用程序成功的关键因素之一。良好的UI设计不仅能够提升用户体验,还能直接影响应用的市场表现。Google在其官方开发者博客中...
在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有表现力的UI元素,提升用户体验。本文将深度剖析如何实现一个名为“水晶/水滴 波浪球”的自定义View,并通过详细步骤讲解,帮助你掌握...
以下是对这些核心知识点的深度解析。 #### 一、资源管理:`android.content.res.Resources` 在Android开发中,`Resources`类扮演着资源管理者的角色,它负责访问应用中的各类资源,如raw asset文件、颜色定义、...
综上所述,Android源码设计模式解析与实战不仅是一本关于技术实现的书籍,更是一次深度学习如何优化代码结构、提高程序效率的过程。通过上述对几种典型设计模式的详细介绍,希望能帮助读者更好地理解和运用这些模式...
本文将深入探讨Android UI优化的源码层面,帮助开发者更好地理解并实现高效的UI更新与渲染。 首先,我们要明白Android UI的基本架构是基于View和ViewGroup的层次结构。每个View代表屏幕上的一个元素,而ViewGroup则...
根据给定的内容片段,可以提取以下知识点来解析Android与iOS两大移动操作系统的优劣: 1. 应用生态与分发平台:文中提到了App Store和Android Market(后来更名为Google Play商店),这是两个平台在应用分发上的...
【大话企业级Android开发_UI(上)】章节主要涵盖了Android应用开发中的用户界面(UI)设计基础。在Android平台上,UI设计对于构建用户友好、交互性强的应用至关重要。本章节可能涉及以下知识点: 1. **UI概述** - *...
`setContentView`的过程涉及了Android系统如何将UI设计文件解析并呈现到屏幕的细节。理解这一过程对于开发者来说至关重要,因为这可以帮助优化布局加载性能,避免不必要的内存消耗,提高应用的用户体验。通过对源码...
《Android开发:微信UI版PhotoPicker的深度解析与实践》 在移动应用开发领域,尤其是在Android平台上,图片的加载和展示是用户体验中的重要一环。微信作为全球最受欢迎的社交应用之一,其用户界面设计和功能实现...
《Android应用源码解析:深度剖析高仿360云盘UI》 在移动开发领域,Android平台以其开源、自由的特性吸引了众多开发者。而360云盘作为一款备受欢迎的云存储服务,其用户界面(UI)设计独特且用户体验优秀。本篇文章...
在Android开发中,UI设计是至关重要的一环,它直接影响到用户对应用的第一印象和使用体验。本项目"Android UI-最新版糗事百科布局,带简单数据加载"旨在提供一个仿照最新版糗事百科应用的界面布局,并实现数据加载...
- 更新UI:在主线程中更新图形,使用计算出的频率强度更新图表。 6. **注意点**: - 填充零值:如果音频数据不足FFT大小,通常需要填充零值以满足FFT的要求。 - 均衡处理:为了避免低频部分占据过多显示空间,...
《Android Framework深度解析》 Android Framework是Android操作系统的核心组成部分,它是Android应用开发的基础,负责提供应用程序接口(API)以及系统服务。在这个详细分析中,我们将深入探讨Android Framework的...
在Android系统中,触摸事件(Touch Event)是用户与设备交互的重要方式,它涉及到了UI控件的响应和处理。本文将深入解析Android的Touch事件传递机制,帮助开发者理解这一核心概念。 首先,我们了解下Android中的...
《Android 4.0 桌面时钟源码DeskClock深度解析》 在Android操作系统中,DeskClock是一款内置的桌面时钟应用,它集成了多种功能,包括时钟、闹钟、计时器和秒表。对于开发者来说,深入理解DeskClock的源码能够帮助...