先大致说下步骤:
1:点击按纽的时候,把线程加入消息对列
2:在线程中,做进度变化的操作
3:由handler向主线程发送修改UI界面的消息
4:由handler负责处理消息并修改UI界面
以下是我自己亲测的小demo
package com.example.handlerprogressbardemo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
/**
* handler机制原理:
* 点击开始按纽的时候,1:把线程加入消息对列里面,2:在子线程 里面做一些进度变化的显示。3:通过handler向主线程发送消息,
* 请求修改UI界面,4:由handler负责处理消息,最终来修改UI界面。
*
*
*/
public class MainActivity extends Activity {
private Handler handler;
private Button mStartButton, mEndButton;
private ProgressBar bar;
// private Runnable updateBarThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initCom();
}
private void initCom() {
bar = (ProgressBar) findViewById(R.id.progressBar);
mStartButton = (Button) findViewById(R.id.button_start);
mStartButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 第一次把线程加入消息对列
handler.post(updateBarThread);
}
});
handler = new Handler(){
public void handleMessage(android.os.Message msg) {
// handler更新UI
bar.setProgress(msg.arg1);
handler.post(updateBarThread);
if(i>=100){
bar.setProgress(0);
// 这里为什么要对i进行重新赋值啊,是因为,当进度大于100的时候,把进度条虽然清空了,但其实子线程还在
// 一直不停地走,而这时候i的值肯定是大于100的,所以会看不出效果,所以必须对i进行重新赋值,这样才会循
// 环操作
i = 0;
}
};
};
mEndButton = (Button) findViewById(R.id.button_end);
mEndButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
handler.removeCallbacks(updateBarThread);
}
});
}
private int i = 0;
Runnable updateBarThread = new Runnable(){
// int i = 0;
int progress = 1;
int count = 10;
@Override
public void run() {
// i = i + 2;
i = i + 100/10;
// i = i + progress/count;
Message msg = handler.obtainMessage();
// 用arg1提高性能
msg.arg1 = i;
handler.sendMessage(msg);
// 睡眠0.5秒
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i>=100){
handler.removeCallbacks(updateBarThread);
}
}
};
}
下面是引用网络的小demo:
Handler与Runnable
- public class MainActivity extends Activity
- {
- private Button mStartBtn,mEndBtn;
- private Handler mHandler;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- initCom();
- }
- private void initCom()
- {
- mHandler = new Handler();
- mStartBtn = (Button)findViewById(R.id.button_start);
- mStartBtn.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- //第一次加入消息队列
- mHandler.post(r);
- }
- });