`

线程(三)

 
阅读更多

Android 中,经常用到的定时器主要有以下几种实现:
一、采用Handler与线程的sleep(long )方法
二、采用Handler的postDelayed(Runnable, long) 方法
三、采用Handler与timer及TimerTask结合的方法。
下面逐一介绍:
一、采用Handle与线程的sleep(long )方法
Handler主要用来处理接受到的消息。这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释。


1.定义一个Handler类,用于处理接受到的Message.
Handler handler = new Handler() {
public void handleMessage(Message msg) {
//要做的事情
super.handleMessage(msg);
}
};
2.新建一个实现Runnable接口的线程类。如下:
public class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(10000);//线程暂停10秒,单位毫秒
Message message=new Message();
message.what=1;
handler.sendMessage(message);//发送消息
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3.在需要启动线程的地方加入下面语句:
new Thread(new MyThread()).start();
4.启动线程后,线程每10s发送一次消息。
实例:
package com.quding.thread;

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

public class MyCounter extends Activity{

	private TextView mTextView;
	private Handler handler;
	private int count;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mycounter);
		mTextView = (TextView) findViewById(R.id.mycounter_textView);

		handler = new Handler(Looper.getMainLooper()){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				if(msg.what == 1){
					//添加要干的事情
					count++;
					mTextView.setText(count + "");
				}
			}
		};
		
		new Thread(new MyThread()).start();
		Log.e("tag", "cehsi");

	}
	
	public class MyThread implements Runnable{
		public void run() {
			while(true){
				try {
					Message message = new Message();
					message.what = 1;
					Thread.sleep(1000);   //间隔时间在这里定
					//通过handler把这个线程的线程体放到主线程的消息队列中,使得该线程在主线程中执行
					handler.sendMessage(message);
				} catch (Exception e) {
					e.printStackTrace();
					}
			}
		}
	}
}
 
二、采用Handler的postDelayed(Runnable, long) 方法
这个实现比较简单一些:
1. Handler handler=new Handler();
Runnable runnable=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//要做的事情
handler.postDelayed(this, 2000);
}
};
2.启动计时器:
handler.postDelayed(runnable, 2000);//每两秒执行一次runnable.
3.停止计时器:
handler.removeCallbacks(runnable);
package com.quding.thread;

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

public class MyCounter extends Activity{

	private TextView mTextView;
	private Handler handler;
	private int count;
	private Runnable myRunnable;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mycounter);
		mTextView = (TextView) findViewById(R.id.mycounter_textView);
		
		handler = new Handler(Looper.getMainLooper());
		myRunnable = new Runnable(){
			@Override
			public void run() {
				//此处添加每个一段时间要执行的语句
				count++;
				mTextView.setText(count + "");
				handler.postDelayed(this, 1000);
			}
		};
		//启动计时器
		handler.postDelayed(myRunnable, 1000);
	}

	@Override
	protected void onStop() {
		super.onStop();
		handler.removeCallbacks(myRunnable);
	}
}
 
三、采用Handler与timer及TimerTask结合的方法。
1.定义定时器、定时器任务及Handler句柄
private final Timer timer = new Timer();
private TimerTask task;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
//要做的事情
super.handleMessage(msg);
}

};
2.初始化计时器任务。
task = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
3.启动定时器
timer.schedule(task, 2000, 2000);
简要说一下上面三步提到的一些内容。
1.定时器任务(TimerTask)顾名思义,就是说当定时器到达指定的时间时要做的工作,这里是想Handler发送一个消息,由Handler类进行处理。
2. java.util.Timer.schedule(TimerTask task, long delay):这个方法是说,dalay/1000秒后执行task.只执行一次。
java.util.Timer.schedule(TimerTask task, long delay, long period):这个方法是说,delay/1000秒后执行task,然后进过period/1000秒再次执行task,这个用于循环任务,执行无数 次,当然,你可以用timer.cancel();取消计时器的执行。

package com.quding.thread;

import java.util.Timer;
import java.util.TimerTask;

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

public class MyCounter extends Activity{

	private TextView mTextView;
	private Handler handler;
	private int count;
	private Timer timer = new Timer();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mycounter);
		mTextView = (TextView) findViewById(R.id.mycounter_textView);
		
		handler = new Handler(Looper.getMainLooper()){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				if(msg.what == 1){
					count++;
					mTextView.setText(count + "");
				}
			}
		};
		
		TimerTask task = new TimerTask() {
			@Override
			public void run() {
				Message msg  =new Message();
				msg.what = 1;
				handler.sendMessage(msg);
			}
		};
		
		timer.schedule(task, 10000, 1000);  // 第二个参数是定时开始计时,第三个参数是时间间隔
		
	}
}
 
分享到:
评论

相关推荐

    线程三个随机数

    在这个特定的“线程三个随机数”示例中,我们可能遇到的是一个利用多线程技术来生成并显示三个独立随机数的场景。这通常涉及到并发编程和随机数生成的知识点。 首先,让我们讨论线程。在单线程程序中,所有操作按...

    MFC MultiThread(多线程三个实例).zip

    MFC MultiThread(多线程三个实例)This file contains a summary of what you will find in each of the files that make up your MultiThread11 application.

    实时多线程三维引擎内核的研究与实现

    论文利用多核处理器所带来的硬件性能和面向对象技术所带来的开发效率的提升,将并行并发同面向对象技术融合,实现了面向对象的多线程并行实时三维引擎。新的实时三维引擎既具有面向对象特征,又使程序并行运行变得容易...

    C# MVC 线程和并发

    三、并发控制 * 锁(Lock):用于保护共享资源 * 使用Monitor类来实现锁 * 使用lock语句来实现锁 四、线程的信号机制 * 使用EventWaitHandle类来实现线程的信号机制 * 使用WaitOne()方法来等待信号 * 使用Set()...

    三缓冲区 多线程处理,抓包例子

    本案例探讨的是如何利用“三缓冲区”和多线程技术来实现高效的抓包处理,特别是在Linux环境中,结合libpcap库进行网络数据包捕获。以下是关于这个主题的详细解释。 首先,让我们理解“三缓冲区”的概念。在单线程...

    Java创建线程三种方式的优缺点

    Java创建线程三种方式的优缺点 Java创建线程主要有三种方式:继承Thread类创建线程、实现Runnable接口创建线程和实现Callable和Future创建线程。每种方式都有其优缺点,在实际开发中,选择合适的方式非常重要。 ...

    JavaSE多线程三PPT教案学习.pptx

    JavaSE的多线程编程是Java程序设计中的一个重要部分,它允许程序同时执行多个任务,提高应用程序的效率和响应性。本教程主要讲解了Java中关于线程等待、唤醒以及生产者-消费者问题的实现。 1. **线程等待、唤醒机制...

    嵌入式Linux应用程序开发第9章多线程编程

    Linux 线程机制可以分为用户级线程、轻量级进程和内核线程三个方面。用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,不需要特定的内核支持。在这里,操作系统往往会提供一...

    Android 中三种启用线程的方法总结

    在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而...

    Java多线程三种主要实现方式解析

    Java多线程三种主要实现方式解析 Java多线程三种主要实现方式解析是Java编程语言中最重要的概念之一。在 Java 中,实现多线程有多种方式,本文将详细介绍 Java 中的三种主要实现方式:继承Thread类、实现Runnable...

    多线程编程

    例如,进程A可以有线程一、线程二和线程三,它们都访问同一个用户地址空间,但各自执行不同的任务。 线程机制主要有以下几种类型: 1. 用户级线程:线程管理完全由用户空间的线程库完成,操作系统不直接参与。当一...

    多线程在三维场景中的应用

    【多线程在三维场景中的应用】 在三维场景的渲染和可视化中,多线程技术是一种重要的优化手段,尤其在处理大规模数据时,能够显著提升性能和用户体验。本报告主要探讨了多线程如何应用于三维场景的实时可视化,以及...

    MFC多线程 工作者线程 用户界面线程

    三、用户界面线程 用户界面线程(User Interface Thread)主要负责处理用户的输入和显示界面更新。MFC的主窗口类,如CFrameWnd或CDialog,都是在主线程中创建和管理的,因此用户界面线程通常是主线程。为了保持界面...

    三个线程交错输出

    本实验“三个线程交错输出”旨在探讨和展示如何在Java环境中实现线程间的交互和交错打印,以此来理解线程的并发行为。 首先,我们要明白进程与线程的概念。一个进程是操作系统分配资源的基本单位,它包含了运行中的...

    MFC多线程的创建,包括工作线程和用户界面线程

    #### 三、CWinThread类详解 ##### 3.1 CWinThread类介绍 在MFC中,`CWinThread` 类是用来表示线程的基础类,它是所有线程的父类。通过继承 `CWinThread` 可以创建自己的线程类,并且可以通过调用 `CreateThread` ...

    Java线程(第三版)

    《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...

    JAVA线程第三版

    《JAVA线程第三版》是Java并发编程领域的一本经典著作,主要针对Java线程的深入理解和实践提供了详尽的指导。这本书详细介绍了如何在Java应用程序中有效地使用多线程,以提高程序的性能和可扩展性。Java线程是Java...

    JAVA线程(第三版)

    《JAVA线程(第三版)》是一本深入探讨Java多线程编程的权威书籍,针对Java线程的管理和优化提供了详尽的解析。线程在现代计算机编程中扮演着至关重要的角色,尤其是在并发处理和高性能应用中。Java以其强大的线程...

    java启动线程三种方式

    在Java编程语言中,创建和启动线程有多种方法,主要分为三种常见的方式。下面将详细探讨这三种启动线程的方法及其优缺点。 1. 继承Thread类 Java允许我们通过继承Thread类来创建一个新的线程。在子类中重写Thread类...

Global site tag (gtag.js) - Google Analytics