`
duguyidao
  • 浏览: 138453 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

Android Handler 用法

阅读更多
Android handler
根据Android API DOC:Android Handler主要用于发送和处理和一个线程有关联的消息队列(MessageQueue)的消息和可运行对象。从这句话中可以知道Handler发送和处理的对象有两个:Message 和 Runnable对象。每个Handler实例和一个线程和这个线程的消息队列相关联。当然队列的特点就是先进先出的原则。
有下面的例子说明处理的它的两个操作对象:
package com.daisy.android.network;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 *@author Andrew.Lee
 *@create 2011-6-7 下午02:23:11
 *@version 1.0
 *@see
 */

public class HandlerActivity extends Activity implements OnClickListener {
	private static String TAG = "System.out";
	private Button start;
	private Button end;
	private ProgressBar progress;
	private Button progress_button;
	private Button progress_pause;
	private Handler handler;
	private Myhandler Myhandler;
	private boolean threadTerminal = false;
	private EditText editText;
	private TextView textView;

	public void onCreate(Bundle bundle) {
		super.onCreate(bundle);
		setContentView(R.layout.handler);
		findView();
		// define a handler
		handler = new Handler();
		// Output Acitvity thread info
		Log.i(TAG, "Activity Thread id:" + Thread.currentThread().getId());
		Log.i(TAG, "Activity Thread name:" + Thread.currentThread().getName());

	}

	public void findView() {
		editText = (EditText) findViewById(R.id.entry);

		start = (Button) findViewById(R.id.start);
		start.setOnClickListener(this);

		end = (Button) findViewById(R.id.end);
		end.setOnClickListener(this);
		progress = (ProgressBar) findViewById(R.id.progress);

		progress_button = (Button) findViewById(R.id.progress_button);
		progress_button.setOnClickListener(this);

		progress_pause = (Button) findViewById(R.id.pause);
		progress_pause.setOnClickListener(this);

		textView = (TextView) findViewById(R.id.display);

	}

	class Myhandler extends Handler {
		public void handleMessage(Message msg) {
			Log.i(TAG, "Handler process...");
			Log.i(TAG, "Handler Thread id:" + Thread.currentThread().getId());
			Log.i(TAG, "Handler Thread name:"
					+ Thread.currentThread().getName());
			int count = msg.getData().getInt("count");
			String str = msg.getData().getString("display");
			if (count <= 100)
				progress.setProgress(count);
			else
				progress.setVisibility(View.GONE);
			Log.i(TAG, "Handler Thread ---(##)---" + str);
			textView.setText("Handler Thread ---(##)---" + str);
		}

	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		int id = v.getId();
		switch (id) {
		case R.id.start:
			Log.i(TAG, "You just press the start button");
			// associate with the runnable r, create runnable and add into the
			// message queue
			handler.post(r);
			break;
		case R.id.end:
			Log.i(TAG, "You just press the end button");
			// associate with the runnable r, remove the pending posts in the
			// message queue
			handler.removeCallbacks(r);
			break;
		case R.id.progress_button:
			Log.i(TAG, "You just click the progress button");
			progress.setVisibility(View.VISIBLE);
			Myhandler = new Myhandler();
			if (!threadTerminal && !handelrThread.isAlive())
				handelrThread.start();
			break;
		default:
			Log.i(TAG, "You just ...");

		}
	}

	Thread handelrThread = new Thread() {
		int count = 0;

		@Override
		public void run() {
			// TODO Auto-generated method stub
			Log.i(TAG, "Start the thread...");
			Log.i(TAG, "HandlerThread Thread id:"
					+ Thread.currentThread().getId());
			Log.i(TAG, "HandlerThread Thread name:"
					+ Thread.currentThread().getName());
			while (count < 101) {
				try {
					sleep(2000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				count += 10;
				Message msg = new Message();
				Bundle bundle = new Bundle();
				bundle.putInt("count", count);
				bundle.putString("display", editText.getText().toString());
				msg.setData(bundle);
				Myhandler.sendMessage(msg);
				Log.i(TAG, "the count is :" + count);
			}
			threadTerminal = true;
		}
	};

	Runnable r = new Runnable() {

		@Override
		public void run() {
			// post after delay 3 seconds
			Log.i(TAG, "update for every 3 seconds");
			// Output Runnable thread info
			Log.i(TAG, "Runnable Thread id:" + Thread.currentThread().getId());
			Log.i(TAG, "Runnable Thread name:"
					+ Thread.currentThread().getName());
			textView.setText("Text ---(^o^)---Runnable:"
					+ editText.getText().toString());
			handler.postDelayed(r, 3000);
		}

	};

}

上面的例子部分引用 http://www.iteye.com/topic/1062942
使用Start-end button 来说明对Runnable对象的处理和操作
使用ProgressBar 来说明对消息Message的发送和处理。
从上面的例子中发现:
1. Activity、Runnable r、handler 和 Myhandler 都是运行在Activity 主线程中,所以他们都可以对Activity中的UI组件进行设置操作。
2. handelrThread 不是在主线程中,它只能获取UI组件的信息,但是不能对UI组件进行Set操作,或者布局的处理。
分享到:
评论

相关推荐

    android handler 用法

    本篇文章将深入探讨Android Handler的用法及其在刷新界面中的应用。 1. **Handler的基本概念** Handler是Android中的一个类,主要用于发送和处理Message或Runnable对象。它的主要职责是在适当的时间(通常是主线程...

    Android的Handler使用方法总结

    Android的Handler使用方法总结,不错的文档,跟大家分享分享

    Android handler message奇怪用法详解

    本文将深入探讨一个特殊的、不常见的Handler用法,这些用法可能在日常开发中不太常见,但对理解和优化代码逻辑具有重要意义。 首先,让我们回顾一下Handler的基本概念。Handler是Android中的一个类,它用于在不同的...

    模拟Android Handler机制Demo

    3. **发送Message**:使用Handler对象的sendMessage()或sendEmptyMessage()方法将Message发送到消息队列。这些方法会将Message对象放入主线程的消息队列。 4. **Looper处理**:主线程的Looper会持续检查MessageQueue...

    androidHandler测试的demo

    在“androidHandler测试的demo”中,我们可以预期包含以下内容: 1. 创建自定义`Handler`子类:这个子类可能重写了`handleMessage(Message msg)`方法,根据`msg.what`的值执行不同的操作,比如更新UI元素或执行特定...

    Android Handler用法

    在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI更新操作的正确执行。...熟练掌握`Handler`的使用,对于提升Android应用的性能和用户体验至关重要。

    Android Handler传值的demo

    使用`Handler`的`sendMessage(Message msg)`或`sendMessageDelayed(Message msg, long delayMillis)`方法将`Message`发送到消息队列。这些方法会将消息添加到与`Handler`关联的`Looper`的消息队列中。 5. **Looper...

    android-Handler的使用

    【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...

    android handler例子

    2. **发送消息**:在其他线程(如AsyncTask、IntentService等)中,当图片加载完成或有新的图片数据时,创建一个`Message`并附上图片资源ID或其他相关信息,然后使用`Handler`的`sendMessage()`方法发送。...

    Android Handler消息处理顺序分析

    在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,它们共同构建了Android的消息处理机制。本文将详细分析Android Handler消息处理的顺序,以及如何利用这些组件进行异步操作。 首先,理解...

    Android_Handler详解(一)

    本篇将深入探讨Handler的基本概念、使用方法以及其在多线程环境中的作用。 1. Handler是什么? Handler,中文可译为“处理器”,在Android系统中主要负责处理来自其他线程的消息。它通过发送和处理Message对象,...

    android handler的一些测试

    通常,我们传递一个`Looper`实例或`Looper.prepare()`方法来初始化`Handler`。如果未提供`Looper`,则`Handler`将默认使用主线程的`Looper`。这意味着在非主线程中创建`Handler`时,必须明确指定或启动该线程的`...

    android demo,使用Handler的postDelay,Runnable run实现延时3秒的splash。

    本示例中的“android demo”就是关于如何利用Handler的`postDelayed`方法和`Runnable`接口来实现一个延时3秒的Splash Screen。下面将详细解释这个过程以及涉及的技术点。 1. **Handler**: Handler是Android中处理...

    Android中的Handler的具体用法

    本文将深入探讨`Handler`的工作原理、如何使用以及它在Android应用程序中的实际应用。 `Handler`机制是Android系统为了实现线程间通信而设计的一种模式,主要包含三部分:`Handler`、`Message`和`Looper`。`Handler...

    android 中Handler 的几种写法

    通过理解以上知识点,开发者可以灵活地在Android应用中使用`Handler`进行线程间通信,高效地处理异步任务和UI更新。在实际开发中,结合`Handler`、`Looper`、`Thread`以及`Runnable`,可以构建出复杂而稳定的多线程...

    Android Handler模拟进度条更新

    本篇文章将深入探讨如何使用Android Handler来模拟进度条更新。 首先,理解Handler、Looper和Message的基本概念: 1. **Handler**:它是消息处理对象,负责发送和处理Message。在主线程中创建Handler实例后,它...

    android Handler详细使用方法实例

    在上述代码中,我们看到了如何使用Handler和Runnable来实现一个简单的线程启动和停止的逻辑,同时通过postDelayed方法实现了一个延时任务的循环执行。这种模式在Android开发中非常常见,它体现了Android UI编程的单...

    android handler runnable使用实例(关键是内部run中停止)

    在Android应用开发中,Handler、Runnable和Looper是三个非常重要的组件,它们构成了Android的消息处理机制。这个机制使得UI线程可以非阻塞地处理来自其他线程的消息,从而避免了UI冻结,提升了用户体验。下面我们将...

    Android Handler解析

    # Android Handler解析 在Android应用开发中,保持应用程序的响应性是至关重要的。为了实现这一目标,我们需要确保UI线程不会被阻塞。...掌握Handler的使用,对于提高Android应用的性能和用户体验至关重要。

    Android_Handler消息处理机制

    在Android系统中,Handler、Message和Looper构成了一个关键的异步通信机制,即Handler消息处理机制。这个机制允许Android应用程序在不同的线程间传递消息,处理UI更新等操作,是多线程编程中的重要组成部分。下面...

Global site tag (gtag.js) - Google Analytics