Android学习笔记——Handler实例

Handler的实质就是异步消息处理。

实例一:

Handler的基本用法

XML布局代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:id="@+id/tvResult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="高兴点,未来不是梦"/>
    <Button 
        android:id="@+id/btnStart"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="动起来!"/>
     <Button 
        android:id="@+id/btnEnd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="歇会吧!"/>
     <Button 
        android:id="@+id/btnClear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="清零!"/>

</LinearLayout>

Java代码:

public class HandlerActivity extends Activity {

	private Button btnStart;
	private Button btnEnd;
	private Button btnClear;
	private TextView tvResult;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		initContent();
	}

	private void initContent() {
		setContentView(R.layout.activity_handler);
		tvResult = (TextView) findViewById(R.id.tvResult);
		btnStart = (Button) findViewById(R.id.btnStart);
		btnEnd = (Button) findViewById(R.id.btnEnd);
		btnClear = (Button) findViewById(R.id.btnClear);
		btnStart.setOnClickListener(new StartButtonListener());
		btnEnd.setOnClickListener(new EndButtonListener());
		btnClear.setOnClickListener(new ClearButtonListener());
	}

	// 创建一个Handler对象
	Handler handler = new Handler();
	private int i = 0;
	// 将要执行的操作写在线程对象的run方法当中
	Runnable updateThread = new Runnable() {
		public void run() {
			System.out.println("高兴点,追梦!--" + i);
			tvResult.setText("高兴点,追梦!--" + i);
			i++;
			// 在run方法内部,执行postDelayed或者是post方法
			handler.postDelayed(updateThread, 3000);
		};
	};

	class StartButtonListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			// 调用Handler的post方法,将要执行的线程对象添加到队列当中
			handler.post(updateThread);
		}
	}

	class EndButtonListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			// 调用Handler的post方法,将要updateThread从队列当中移除
			handler.removeCallbacks(updateThread);
		}

	}

	class ClearButtonListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			// 调用Handler的post方法,将要updateThread从队列当中移除
			handler.removeCallbacks(updateThread);
			i = 0;
			tvResult.setText("高兴点,未来不是梦");
		}

	}
}

实例二:

Handler与ProgressBar的结合使用

XML布局代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ProgressBar
        android:id="@+id/progressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <Button
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="前进吧,小摩托!" />

</LinearLayout>

Java代码:

public class HandlerProgressBarActivity extends Activity {

	private ProgressBar progressbar;
	private Button btnStart;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		initContent();
	}

	private void initContent() {
		setContentView(R.layout.activity_handlerprogressbar);
		progressbar = (ProgressBar) findViewById(R.id.progressbar);
		btnStart = (Button) findViewById(R.id.btnStart);
		btnStart.setOnClickListener(new StartOnClick());
	}

	class StartOnClick implements OnClickListener {
		@Override
		public void onClick(View v) {
			progressbar.setVisibility(View.VISIBLE);
			updateBarHandler.post(updateThread);
		}
	}

	Handler updateBarHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			progressbar.setProgress(msg.arg1);
			updateBarHandler.post(updateThread);
		}

	};

	Runnable updateThread = new Runnable() {
		int i = 0;

		@Override
		public void run() {
			System.out.println("Begin Thread!" + i);
			i = i + 10;
			Message msg = updateBarHandler.obtainMessage();
			msg.arg1 = i;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			updateBarHandler.sendMessage(msg);
			if (i == 100) {
				updateBarHandler.removeCallbacks(updateThread);
			}
		}

	};

}

实例三:

Handler与线程的关系(一)

XML布局代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="前进吧,小摩托!" />

</LinearLayout>

Java代码:

public class HandlerThreadActivity extends Activity {

	private Handler handler = new Handler();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		initContent();
	}

	private void initContent() {
		handler.post(r);
		setContentView(R.layout.activity_handlerthread);
		System.out.println("activity--->"+Thread.currentThread().getId());
		System.out.println("activityname--->"+Thread.currentThread().getName());
	}

	Runnable r = new Runnable(){

		@Override
		public void run() {
			System.out.println("handler--->"+Thread.currentThread().getId());
			System.out.println("handlername--->"+Thread.currentThread().getName());
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	};

}

实例四:

Handler与线程的关系(二)

XML布局代码:

同【实例三】中的布局代码

Java代码:

public class HandlerThreadActivity extends Activity {

	private Handler handler = new Handler();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		initContent();
	}

	private void initContent() {
		setContentView(R.layout.activity_handlerthread);
		Thread t = new Thread(r);
		t.start();
		System.out.println("activity--->" + Thread.currentThread().getId());
		System.out.println("activityname--->"
				+ Thread.currentThread().getName());
	}

	Runnable r = new Runnable() {

		@Override
		public void run() {
			System.out.println("handler--->" + Thread.currentThread().getId());
			System.out.println("handlername--->"
					+ Thread.currentThread().getName());
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	};

}

实例五:

Handler实现真正的异步消息处理,在新线程中处理消息

XML布局代码:

同【实例三】中的布局代码

Java代码:

public class HandlerMsgActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		initContent();
	}

	private void initContent() {
		setContentView(R.layout.activity_handlermsg);
		// 打印当前线程
		System.out.println("activity---->" + Thread.currentThread().getId());
		// 生成一个HandlerThread对象(具有循环处理消息的功能),实现了Looper来处理消息队列
		HandlerThread handlerThread = new HandlerThread("handler_thread");
		// 让一个线程运行,必须用[线程名称].start()方法
		handlerThread.start();
		MyHandler myHandler = new MyHandler(handlerThread.getLooper());
		Message msg = myHandler.obtainMessage();
		// 将msg发动到目标对象,所谓目标对象,就是生成msg的handler对象
		msg.sendToTarget();
	}

	class MyHandler extends Handler {
		public MyHandler() {

		}

		public MyHandler(Looper looper) {
			super(looper);
		}

		@Override
		// 每当向Handler发送一个msg的时候,就会执行handleMessage()方法
		public void handleMessage(Message msg) {
			System.out.println("handler---->" + Thread.currentThread().getId());
			System.out.println("handlerMessage");
		}
	}
}

实例六:

Handler实现真正的异步消息处理,在新线程中处理消息

XML布局代码:

同【实例三】中的布局代码

Java代码:

public class HandlerMsgActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		initContent();
	}

	private void initContent() {
		setContentView(R.layout.activity_handlermsg);
		// 打印当前线程
		System.out.println("activity---->" + Thread.currentThread().getId());
		// 生成一个HandlerThread对象(具有循环处理消息的功能),实现了Looper来处理消息队列
		HandlerThread handlerThread = new HandlerThread("handler_thread");
		// 让一个线程运行,必须用[线程名称].start()方法
		handlerThread.start();
		MyHandler myHandler = new MyHandler(handlerThread.getLooper());
		Message msg = myHandler.obtainMessage();

		Bundle b = new Bundle();
		b.putInt("age", 20);
		b.putString("name", "滔滔1024");
		msg.setData(b);				//msg.arg1与msg.arg2的消耗比msg.setData()小,但只能传递整型变量
		// 将msg发动到目标对象,所谓目标对象,就是生成msg的handler对象,本例中是发送到MyHandler对象中
		msg.sendToTarget();
	}

	class MyHandler extends Handler {
		public MyHandler() {

		}

		public MyHandler(Looper looper) {
			super(looper);
		}

		@Override
		// 每当向Handler发送一个msg的时候,就会执行handleMessage()方法
		public void handleMessage(Message msg) {
			Bundle b = msg.getData();
			int age = b.getInt("age");
			String name = b.getString("name");
			System.out.println("age->"+age+"\nname->"+name);
			System.out.println("handler---->" + Thread.currentThread().getId());
			System.out.println("handlerMessage");
		}
	}
}
时间: 2024-08-12 17:41:33

Android学习笔记——Handler实例的相关文章

Android学习笔记--Handler用法总结

转自:一叶知秋的博客 http://blog.sina.com.cn/s/blog_77c6324101016jp8.html 一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如 (1) 可以用handler发送一个message,然后在handler的线程中来接收.处理该消息,以避免直接在UI主线程中处理事务导致影响UI主线程的其他处理工作,Android提供了Handler作为主线程和子线程的纽带: (2) 也可以

Android学习笔记-Handler的使用

点击Start按钮,每隔3秒在Logcat里打印一句话     <Button          android:id="@+id/startButton"         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="Start"/>     <But

Android学习笔记48:使用Handler实时更新UI

在Android中,主要通过MessageQueue.Looper和Handler三个类来实现Android应用程序的消息处理.其中,MessageQueue类用来描述消息队列:Looper类用来创建消息队列,以及进入消息循环:Handler类则用来发送消息和接收消息. 本文将主要对Handler进行简要介绍,并以一个简单的实例演示如何使用Handler实时更新UI. 1.Handler的作用 在Android中,当应用程序启动时,Android系统会启动一个主线程(也被称为UI线程),主要用来

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

[Android学习笔记]Android中多线程开发的一些概念

线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关工作就叫做线程同步. android中,处理线程同步的手段就是:锁 一般分为公平锁和非公平锁: synchronized(内部锁,互斥锁):synchronized是JVM提供的线程同步机制,如果出现问题,JVM能捕获异常,并释放资源,具体实现机制需要查看JVM源码 synchronized的使用特

Android学习笔记五之Service

Android学习笔记五之Service 1.什么是Service? 什么是Service?Service是Android系统的四大组件之一,官方文档是这样描述Service的: A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application comp

android学习笔记——利用BaseAdapter生成40个列表项

RT: main.xml ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:orientation="vertical"        

Android学习笔记(十五)——碎片的生命周期(附源码)

碎片的生命周期 点击下载源码 与活动类似,碎片具有自己的生命周期.理解了碎片的生命周期后,我们可以在碎片被销毁时正确地保存其实例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Fragments,在Fragment1.java文件中添加如下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragm

Android学习笔记(四七):Content Provider初谈和Android联系人信息

Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增.删.改.查的操作.Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问.简单地说,Android通过content Provider从数据的封装中获取信息. Content provider使用Uri