`

用Android线程做一个简单的计数器

 
阅读更多

2016.10.4

 

上课类容:Android线程

 

什么是线程?

线程或者线程执行本质上就是一串命令(也是程序代码),然后我们把它发送给操作系统执行。

一般来说,我们的CPU在任何时候一个核只能处理一个线程。多核处理器(目前大多数Android设备已经都是多核)顾名思义,就是可以同时处理多线程(通俗地讲就是可以同时处理多件事)。

多核处理与单核多任务处理的实质

上面我说的是一般情况,并不是所有的描述都是一定正确的。因为单核也可以用多任务模拟出多线程。

每个运行在线程中的任务都可以分解成多条指令,而且这些指令不用同时执行。所以,单核设备可以首先切换到线程1去执行指令1A,然后切换到线程2去执行指令2A,接着返回到线程1再去执行1B、1C、1D,然后继续切换到线程2,执行2B、2C等等,以此类推。

这个线程之间的切换十分迅速,以至于在单核的设备中也会发生。几乎所有的线程都在相同的时间内进行任务处理。其实,这都是因为速度太快造成的假象,就像电影《黑客帝国》里的特工Brown一样,可以变幻出很多的头和手。

 

在学习java的时候,我们接触过线程,知道线程的创建有以下两种。

一:

Android中有两种实现线程thread的方法:

一种是,扩展Java.lang.Thread类 
另一种是,实现Runnable接口

二:
Thread类代表线程类,它的两个最主要的方法是: 
run()——包含线程运行时所执行的代码 
Start()——用于启动线程

Android中的线程和java基本差不多,但是也有区别。

如果我们像java那样使用,就会报错。

我们定义两个类,

例:

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView tv =(TextView)this.findViewById(R.id.textView1);
        Counter c = new Counter(tv);
        //启动线程
        c.start();
    }
}

 

import android.util.Log;
import android.widget.TextView;


public class Counter extends Thread{
	
	TextView tv;
    Counter(TextView tv){
		this.tv = tv;
		
	}
	public void run(){
		
		int i=0;
		while(i<=100){
			//调用了TextView组件
			tv.setText(i);
			Log.i("当前的值为:", i+"");
			
		}
		try {
			sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		i++;
	}

}

 如果这样运行,我们发现,模拟器就会报错。

 它需要用到Handler机制。 

Handler 机制,它是Runnable和Activity交互的桥梁,在run方法中发送Message,在Handler里,通过不同的Message执行不同的任务。

Handler的设计实际上是为了应用程序内其他线程和主线程进行通信,因为只有主线程才能更新UI,其他线程不行

例:

import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class Counter extends Thread{
	
	Handler handler;
	public Counter(Handler handler){
		this.handler = handler;
	}
	public void run(){
		int i=0;
		while(i<=100){
			Log.i("当前的值为:", i+"");
			//发送消息
			Message msg = new Message();
			msg.obj = "当前计数:"+i;
			handler.sendMessage(msg);
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			i++;
			}
	}
}

 

import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class CounterHandler extends Handler{
	
	TextView tv;
	CounterHandler(TextView tv){
		this.tv = tv;
	
	}
	/*
	 * 重写处理消息的方法
	 */
	public void handleMessage(Message msg){
		String showInfo = (String)msg.obj;
		tv.setText(showInfo);
	}
}

 

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		TextView tv = this.findViewById(R.id.action_settings);
		Handler handler = new Handler(tv);
		Counter c = new Counter(hander);
		c.start();
		
	}

 

 

分享到:
评论

相关推荐

    Android多线程实现简单字符串计数器

    使用eclipse实现Android多线程下的简单字符串计数器

    Android计数器(动态更改屏幕上显示)

    本程序是我写的Android计数器(动态更改屏幕上显示)的一个小程序。大家都知道,在Android中要更改UI中的数据要另外启动一个线程。我就以一个计数器的例子,做了更改textView中的数据的例子。

    Android-Thread-Test:Android线程测试

    基本信息支持Android API 15-22(无需支持包) 使用3个库Android注释牛油刀记录仪以Realm CI为主题的色彩API 15-20遵循Holo设计API 21-22遵循材料设计使用者介面底部的两个按钮第一的第二计数器的一个textview 它...

    Android面试(一)Java虚拟机内存结构分析

    虚拟机栈:线程创建之初,Java虚拟机会为每一个线程开辟一块虚拟机栈空间,存储线程方法调用的局部变量,计算中间量,参数等,是线程私有的内存区域。 本地方法栈:线程私有的用于native方法引用的内存栈空间。 程序...

    UnifiedPreferences:Android 的统一共享首选项。 允许使用 DB、JSON 作为 SharedPreferences 的低级存储。 在低端设备上大大提高了性能

    修复线程问题(每个 SharedPreferences 实例都会创建永远不会被破坏的线程) 提供实现数据的任何自定义反/序列化的能力 内存池,允许将 SharedPreferences 用作“短寿命”实例 统计收集,允许在类使用期间收集一些...

    Service Activity的三种交互方式(详解)

    service有两种类型: 本地服务(Local Service):用于应用程序内部 远程服务(Remote Sercie):用于android系统内部的应用程序之间 前者用于实现应用程序自己的一些...这里写了一个计数服务的类,每秒钟为计数器加一

    Android中的内存泄漏

    用一个计数器记录一个对象被引用的次数,如果引用的次数被减少到0,说明这个对象是垃圾对象 可达性分析法:Java JVM通过一些GC Roots向下搜索,如果可以被GC Roots引用到的对象,说明这个对象不是垃圾对象,反之这个...

    JAVA上百实例源码以及开源项目源代码

    简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 ...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    【最新Android高级面试知识点干货分享(三)】

    程序计数器(程序寄存器/PC寄存器Program Count Register):每个新开的线程都会有自己的PC。 栈(Java栈/堆栈Stack):用来存储对像的引用,基本类型的数据。优点:存取速度快,仅次于寄存器,栈数据可以共享。缺点:...

    Android范例

    // 计数器 SharedPreferences SP; // 数据库 static Rect rt; // 矩形对象 Path pa;// 路径 Music Mp; // ------------------------------------------------ 文本导入 static File file; // ---------...

    Java虚拟机

    虚拟机实现高效并发所做的一系列锁优化措施。 前言 第一部分 走近Java 第1章 走近Java 1.1 概述 1.2 Java技术体系 1.3 Java发展史 1.4 Java虚拟机发展史 1.4.1 Sun Classic Exact VM 1.4.2 Sun HotSpot VM ...

Global site tag (gtag.js) - Google Analytics