当前位置: 首页 > news >正文

Android应用开发学习笔记之多线程与Handler消息处理机制

作者:刘昊昱 

博客:http://blog.csdn.net/liuhaoyutz

 

和JAVA一样,Android下我们可以通过创建一个Thread对象实现多线程。Thread类有多个构造函数,一般通过构造函数Thread(Runnable runnable)实现多线程,代码如下:

 

Thread thread = new Thread(new Runnable() {
         //重写Runnable的run()方法
         publicvoid run() {
                   //子线程操作实现
         }
});
thread.start();          // 启动线程thread执行


 

使用标准的JAVA线程类Thread可以创建子线程,但是在Android下,用Thread创建的线程有一个问题就是Thread创建的子线程不能对UI界面进行任何操作。为此,Android引入了Handler消息处理机制,通过Handler在子线程和UI线程之间传递信息,达到更新UI界面的目的。

下面看一个使用Handler处理消息的例子,其运行效果如下:

先来看主布局文件,其内容如下:

 

<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
 
   <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />
 
</LinearLayout>


 

下面看主Activity文件的实现,其内容如下:

 

package com.liuhaoyu;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {
	public Handler handler;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final TextView text = (TextView)findViewById(R.id.textView);
        handler = new Handler() {
    		public void handleMessage(Message msg) {
    			Log.i("Looper",String.valueOf(msg.what));
    			if(msg.what == 0x0)
    			{
    				text.append(Integer.toString(msg.arg1));
    			}
    			} 
    		};
 
    	Thread thread = new Thread(new Runnable() {
    		public void run() {
    			int i = 0;
    			while(true)
    			{
    				try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
                    Message message = new Message();
                    message.arg1 = i;
                    message.what = 0x0;
                    handler.sendMessage(message);
                    
                    if(i < 9)
    					i++;
    				else
    					i = 0;
    			}
    		}
    	});
    	thread.start();
    }
}


 

 

相关文章:

  • jquery $.each() 小探
  • HDU 4089 Activation
  • Linux 上安装 Subversion
  • PHP5.4第二天——数组、多维数组和数组函数
  • MySQL数据库中delimiter的作用概述
  • unigui验证微信服务器的有效性
  • python PIL except: IOError: decoder jpeg not available
  • Pyp 替代sed,awk的文本处理工具
  • 看电影读小说,你就能懂经济学
  • android 开发环境安装和测试中常出现的问题
  • 转---9 个开始使用 C++11 的理由
  • 技本功丨呀~我不会写CSS之vertical-align(上集)
  • 如何正确理解,内页权重高于首页?
  • Android adb 修改手机代理方式
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • [deviceone开发]-do_Webview的基本示例
  • [译]CSS 居中(Center)方法大合集
  • “大数据应用场景”之隔壁老王(连载四)
  • 【笔记】你不知道的JS读书笔记——Promise
  • 2017 前端面试准备 - 收藏集 - 掘金
  • CSS实用技巧
  • ES6 学习笔记(一)let,const和解构赋值
  • HTTP中GET与POST的区别 99%的错误认识
  • JavaScript类型识别
  • js面向对象
  • js算法-归并排序(merge_sort)
  • Linux后台研发超实用命令总结
  • Node 版本管理
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Vue官网教程学习过程中值得记录的一些事情
  • 机器学习 vs. 深度学习
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 说说动画卡顿的解决方案
  • 限制Java线程池运行线程以及等待线程数量的策略
  •  一套莫尔斯电报听写、翻译系统
  • 一些关于Rust在2019年的思考
  • 数据库巡检项
  • ​configparser --- 配置文件解析器​
  • ​马来语翻译中文去哪比较好?
  • (12)目标检测_SSD基于pytorch搭建代码
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (ibm)Java 语言的 XPath API
  • (poj1.2.1)1970(筛选法模拟)
  • (离散数学)逻辑连接词
  • (六)c52学习之旅-独立按键
  • (十一)图像的罗伯特梯度锐化
  • (五)MySQL的备份及恢复
  • (转)人的集合论——移山之道
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Core 中的路径问题
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NetCore部署微服务(二)
  • .net中生成excel后调整宽度