Handler的使用简介
2012-08-07 15:07
78 查看
handler并不是重新启动一个线程,而是在主线程的基础上调用了run函数,实则还是在主线程中运行,真正的子线程是通过thread类调用start()实现的。
package com.yanjun;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**handler消息队列的使用,实现异步消息的处理
* @author YanJun
*post()---将线程加入消息队列
*removeCallbacks()---将线程从消息队列中移除
*postDelayed()---以先进先出的形式执行线程队列
*/
public class HandlerActivity extends Activity {
/** Called when the activity is first created. */
private Button startButton ;
private Button endButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//根据控件的ID得到空间的对象
startButton = (Button) findViewById(R.id.button_start);
endButton = (Button) findViewById(R.id.button_end);
//监听事件
startButton.setOnClickListener(new startButtonListener());
endButton.setOnClickListener(new endButtonListener());
}
class startButtonListener implements OnClickListener{
public void onClick(View v) {
// 将线程对象加入线程对列----post()
handler.post(runnable);
}
}
class endButtonListener implements OnClickListener{
public void onClick(View v) {
//移除线程对象---removeCallbacks()
handler.removeCallbacks(runnable);
}
}
//创建handler对象
Handler handler = new Handler();
//将要执行的操作写在线程对象的run()当中
Runnable runnable = new Runnable() {
public void run() {
System.out.println("大量复杂的操作如:下载等");
//将线程加入到线程队列中----先进先出----postDelayed()或者post()
handler.postDelayed(runnable, 3000);
//执行post()没有时间间隔,运行会很快
// handler.post(runnable);
}
};
}handler与进度条
package com.yanjun;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class Handler_ProgressBarActivity extends Activity {
/**运行时效果实现了,但是出现了死循环 */
Button start = null;
// 进度条的最大值是100
ProgressBar progressBar = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button) findViewById(R.id.button_start);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
start.setOnClickListener(new start());
}
class start implements OnClickListener {
// 当点击按钮时会触发监听事件
public void onClick(View v) {
// 组件在XML中将Visibility设置为gone
progressBar.setVisibility(View.VISIBLE);// 将隐藏的进度条可视化
updataBarHandler.post(runnable);
}
}
// 使用匿名内部类来重写handler中的handleMessage()
Handler updataBarHandler = new Handler() {
// handleMessage取出消息队列的方法
@Override
public void handleMessage(Message msg) {
// 设置progressBar的当前值
progressBar.setProgress(msg.arg1);
// 获得包含消息队列的线程队列
updataBarHandler.post(runnable);
}
};
// 线程类,该类以匿名内部类的方式进行声明
Runnable runnable = new Runnable() {
int i = 0;
public void run() {
System.out.println("进度条开始执行");
i = i + 10;
// 得到一个消息队列Message通过updataBarHandler.obtainMessage()得到该对象
// 通过arg1参数得到对象的优点:系统性能消耗少
Message msg = updataBarHandler.obtainMessage();
// 将message的arg1参数的值设置为i
msg.arg1 = i;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 将消息队列加入到线程中去
updataBarHandler.sendMessage(msg);
if (i == 50) {
// 满足条件后去掉handler中的线程对象runnable
updataBarHandler.removeCallbacks(runnable);
}
}
};
}
线程与handler的关系-----界面延时显示
package com.yanjun;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
/**handler消息队列的使用,实现异步消息的处理
* @author YanJun
*post()---将线程加入消息队列
*removeCallbacks()---将线程从消息队列中移除
*postDelayed()---以先进先出的形式执行线程队列
*/
public class HandlerActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler.post(runnable);
setContentView(R.layout.main);
System.out.println("主线程id"+Thread.currentThread().getId());
System.out.println("主线程名称"+Thread.currentThread().getName());
}
Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("handler"+Thread.currentThread().getId());
System.out.println("handler"+Thread.currentThread().getName());
}
};
}本文出自 “Android的一点一滴” 博客,请务必保留此出处http://haiyuanxi.blog.51cto.com/4230602/957161
package com.yanjun;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**handler消息队列的使用,实现异步消息的处理
* @author YanJun
*post()---将线程加入消息队列
*removeCallbacks()---将线程从消息队列中移除
*postDelayed()---以先进先出的形式执行线程队列
*/
public class HandlerActivity extends Activity {
/** Called when the activity is first created. */
private Button startButton ;
private Button endButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//根据控件的ID得到空间的对象
startButton = (Button) findViewById(R.id.button_start);
endButton = (Button) findViewById(R.id.button_end);
//监听事件
startButton.setOnClickListener(new startButtonListener());
endButton.setOnClickListener(new endButtonListener());
}
class startButtonListener implements OnClickListener{
public void onClick(View v) {
// 将线程对象加入线程对列----post()
handler.post(runnable);
}
}
class endButtonListener implements OnClickListener{
public void onClick(View v) {
//移除线程对象---removeCallbacks()
handler.removeCallbacks(runnable);
}
}
//创建handler对象
Handler handler = new Handler();
//将要执行的操作写在线程对象的run()当中
Runnable runnable = new Runnable() {
public void run() {
System.out.println("大量复杂的操作如:下载等");
//将线程加入到线程队列中----先进先出----postDelayed()或者post()
handler.postDelayed(runnable, 3000);
//执行post()没有时间间隔,运行会很快
// handler.post(runnable);
}
};
}handler与进度条
package com.yanjun;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class Handler_ProgressBarActivity extends Activity {
/**运行时效果实现了,但是出现了死循环 */
Button start = null;
// 进度条的最大值是100
ProgressBar progressBar = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button) findViewById(R.id.button_start);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
start.setOnClickListener(new start());
}
class start implements OnClickListener {
// 当点击按钮时会触发监听事件
public void onClick(View v) {
// 组件在XML中将Visibility设置为gone
progressBar.setVisibility(View.VISIBLE);// 将隐藏的进度条可视化
updataBarHandler.post(runnable);
}
}
// 使用匿名内部类来重写handler中的handleMessage()
Handler updataBarHandler = new Handler() {
// handleMessage取出消息队列的方法
@Override
public void handleMessage(Message msg) {
// 设置progressBar的当前值
progressBar.setProgress(msg.arg1);
// 获得包含消息队列的线程队列
updataBarHandler.post(runnable);
}
};
// 线程类,该类以匿名内部类的方式进行声明
Runnable runnable = new Runnable() {
int i = 0;
public void run() {
System.out.println("进度条开始执行");
i = i + 10;
// 得到一个消息队列Message通过updataBarHandler.obtainMessage()得到该对象
// 通过arg1参数得到对象的优点:系统性能消耗少
Message msg = updataBarHandler.obtainMessage();
// 将message的arg1参数的值设置为i
msg.arg1 = i;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 将消息队列加入到线程中去
updataBarHandler.sendMessage(msg);
if (i == 50) {
// 满足条件后去掉handler中的线程对象runnable
updataBarHandler.removeCallbacks(runnable);
}
}
};
}
线程与handler的关系-----界面延时显示
package com.yanjun;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
/**handler消息队列的使用,实现异步消息的处理
* @author YanJun
*post()---将线程加入消息队列
*removeCallbacks()---将线程从消息队列中移除
*postDelayed()---以先进先出的形式执行线程队列
*/
public class HandlerActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler.post(runnable);
setContentView(R.layout.main);
System.out.println("主线程id"+Thread.currentThread().getId());
System.out.println("主线程名称"+Thread.currentThread().getName());
}
Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("handler"+Thread.currentThread().getId());
System.out.println("handler"+Thread.currentThread().getName());
}
};
}本文出自 “Android的一点一滴” 博客,请务必保留此出处http://haiyuanxi.blog.51cto.com/4230602/957161
相关文章推荐
- 定时器,Handler,Thread,Runnable的使用简介
- Android Handler简介及使用 HandlerThread的使用
- Android Handler简介及使用 HandlerThread的使用
- Android异步查询框架AsyncQueryHandler使用简介
- ImageJ工具使用简介
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
- 在比特币等数字货币中使用的哈希算法简介
- 消息队列(Message Queue)简介及其使用
- curl使用简介
- Kvm 简介 安装 使用 桥接网络
- Android开发笔记 Handler使用总结
- SVN学习笔记 - SVN的简介和使用
- Flex全局错误处理Global Error Handler在AIR 2.0和Flash Player 10.1中使用
- 在非UI线程中使用Handler实现请求队列
- CListCtrl用法简介及使用技巧(一
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
- Java Service Wrapper简介与使用 linux
- c++中STL库 简介 及 使用说明
- Handler的入门使用
- 母函数简介及简单使用(附HDU 1284 钱币兑换问题 解题报告)