android:layout_height="fill_parent"
android:orientation="vertical" >
/** ProgressBar android:id="@+id/ProgressBar02" android:layout_width="wrap_content"
android:max="100"
style="?android:attr/progressBarStyleLarge" 大圆型的
android:progress="50" android:secondaryProgress="70"
android:indeterminate="false"
android:visibility="gone"
android:layout_height="wrap_content">
ProgressBar的样式*/
android:layout_height="wrap_content"
android:max="100" />
package ntc.handler;
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.ProgressBar;
public class HandlerActivity extends Activity {
Button btnstart;
Button btnend;
Button startpb;
ProgressBar pb;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnstart=(Button)this.findViewById(R.id.btnstart);
btnend=(Button)this.findViewById(R.id.btnend);
startpb=(Button)this.findViewById(R.id.startpb);
pb=(ProgressBar)this.findViewById(R.id.pb);
startpb.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
pbhandler.post(pbthread);用于将pbthread线程放入消息队列,即相当于启动线程,同时在消息队列中一直不停启动
}});
btnstart.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
handler.post(testthread);
}});
btnend.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
handler.removeCallbacks(testthread);将线程testthread移出消息队列,既是结束线程
}});
}
Handler pbhandler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
//pb.setProgress(msg.arg1);
pb.setProgress(msg.getData().getInt("progress"));设置progress通过Message
// pbhandler.post(pbthread);
}};
public int mm=0;
Runnable pbthread=new Runnable(){
@Override
public void run() {
mm+=10;
Message message=pbhandler.obtainMessage();
//message.arg1=mm;
Bundle bundle=new Bundle();
bundle.putInt("progress", mm);
message.setData(bundle);
pbhandler.sendMessage(message);
if(mm==100) pbhandler.removeCallbacks(pbthread);
/**
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
pbhandler.postDelayed(pbthread, 1000);handler将线程休眠,相当于sleep
}};
Handler handler=new Handler();
Runnable testthread=new Runnable(){
@Override
public void run() {
Log.i("cys","=====1");
handler.postDelayed(testthread, 3000);
}
};
}
通过实验发现handler.post(thread),其实没有开启新线程通过log可以查看,其实还在原来的线程中,有时开发需要不在同一个线程,我们该如何处理呢
Looper是循环从消息队列中取消息处理消息,当队列中没有消息时,它处于休眠状态
但一般很少实例化Looper,可以通过实例化系统自带的HandleThread,来实现Looper的功能
步骤1.写个内部类
class MyHandler extends Handler{
public MyHandler(){}
public MyHandler(Looper looper){ super looper;}
@Override
public void handleMessage(Message msg) {
处理消息
}
}
2.在oncreate方法
HandlerThread handlerthread=new HandlerThread("handler_thread");
handlerthread.start();
MyHandler myhandler=new MyHandler(handlerthread.getLooper());注意Looper的获取
Message msg=myhandler.obtainMessage();
Bundle bundle=new Bundle();
bundle.putInt("d",1);
bundle.putString().....也可以是数组等等
msg.arg1....
msg.setData(bundle);或者用myhandler.sendmsg(msg);
大家可以用log看看是否在同一线程;Thread.currentThread().getId();或者Thread.currentThread().getName();可以查看当前线程的id和名字