您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: