android之handler
这是一个关于handler的例子,简单实现了handler的用法。
package com.yx.handlerforprogressbar;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
private Button barButton;
private ProgressBar bar;
private int bargo = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
barButton = (Button) findViewById(R.id.barButton);
barButton.setOnClickListener(new BarButtonListener());
bar = (ProgressBar) findViewById(R.id.bar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
class BarButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
handler.post(barThread);
}
}
//使用匿名内部;类复写其中handlerMessage方法
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
bar.setProgress(msg.arg1);
handler.post(barThread);//将barThread压入到线程队列中
}
};
Runnable barThread = new Runnable() {
int i=0;
@Override
public void run() {
// 方法一
/*
if(bargo<bar.getMax()){
System.out.println("barThread");
bar.setProgress(++bargo);
handler.postDelayed(barThread, 1000);
}*/
//方法二
i=i+10;
//得到一个消息对象,message对象由android系统提供。
Message msg = handler.obtainMessage();
//用arg1和arg2两个成员变量传递消息,优点是系统性能消耗较少
msg.arg1 = i;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendMessage(msg);//将msg压入到message队列中
if(i==100){//100为进度条默认的最大值
handler.removeCallbacks(barThread);
}
}
};
}
在上面代码中仅仅是实现了handler的用法,但是在android机制中handler是在主线程中运行的。这并不是我们期望的。
一下代码可以使线程分开。
package com.yx.handlerforprogressbar;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
public class HandlerTest2Activity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//打印当前线程的id
System.out.println("activityID-->"+Thread.currentThread().getId());
System.out.println("activityNAME-->"+Thread.currentThread().getName());
//生成一个HandlerThread对象,实现使用looper来处理消息队列的功能
HandlerThread thread = new HandlerThread("handler_thread");
thread.start();
//在使用getLooper()之前,必须先start线程,否则getLooper()为null
MyHandler myHandler = new MyHandler(thread.getLooper());
Message msg = myHandler.obtainMessage();
/*传递数据
* msg.arg1;
msg.arg2;
msg.obj="sss";
msg.setData(data);//bandle对象,类似于map数组
*/
msg.sendToTarget();//message 传递数据
}
class MyHandler extends Handler{
//两个构造函数
public MyHandler(){}
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
System.out.println("MyHandlerID-->"+Thread.currentThread().getId());
System.out.println("MyHandlerNAME-->"+Thread.currentThread().getName());
}
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。