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使用方法,Button事件响应处理,Activity切换
Android的Handler使用方法总结,不错的文档,跟大家分享分享
Android Handler传值的,简单的介绍了Handler的用法
用android的handler机制作了一个刷新画面的小例子。
android的多线程消息处理机制核心成员handler,基本用法很简单,相关资料也很多。本例子给大家带来handler的奇葩用法,与大家一起分享。
一个简单的小例子,用来学习android Handler和ProgressBar的用法
在Android开发中,我们经常会遇到这样一种情况:在UI界面上进行某项操作后要执行一段很耗时的代码,比如我们在界面上点击了一个”下载“按钮,那么我们需要执行网络请求,这是一个耗时操作,因为不知道什么时候才能...
* 创建一个Handler对象,使用Handler对象h把Runnable的对象r压入队列 * 此时只会会执行Run()方法,但是不会开启新的线程 */ //Handler h = new Handler(); //h.post(r); /* * 在java中真正开启...
ps:这是关于Android Handler 机制的第一篇文章,主要来说一下Handler的用法,本文尽量归纳完全,如有缺漏,欢迎补充。 Handler的主要作用是切换线程,以及隐式的充当接口回调的作用,当子线程网络请求结束后,通过...
开发环境为android4.1.Handler使用例1这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中.本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会继续启动该...
NULL 博文链接:https://txlong-onz.iteye.com/blog/934957
android:handler简单用法
Handler是Android SDK来处理异步消息的核心类。 子线程与主线程通过Handler来进行通信。子线程可以通过Handler来通知主线程进行UI更新。 Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制。每个...
主要介绍了android的handler使用方法,大家参考使用吧
1.简介之前讲了关于Handler的原理,这篇要讲一讲关于Handler的使用方法。2. Handler的初始化通过下面的代码可知,当msg.what 中的数值
实现进度条自动滚动实例,使用到了Handler,thread,toast,消息队列,事务队列等方法,通过按钮控制进度条的运行,使用toast来提示当前状态信息。
Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler的原理 Handler使用的原因 1.多线程更新Ui会导致UI界面错乱 2.如果...
作为android开发重要的一部分。handler起到了十分重要的作用。就像布局文件一样。这个很重要。文档中由于时间关系后期排版不是很好。希望读者见谅。
NULL 博文链接:https://txlong-onz.iteye.com/blog/826617