先大致说下步骤:
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);
- }
- });
- mEndBtn = (Button)findViewById(R.id.button_end);
- mEndBtn.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- mHandler.removeCallbacks(r);
- }
- });
- }
- Runnable r = new Runnable()
- {
- @Override
- public void run()
- {
- //要这些的操作,写在run()方法内部
- Log.e("-------", "------------");
- mHandler.postDelayed(r, 1000);
- }
- };
- }
用Handler更新UI
- public class MainActivity extends Activity
- {
- private Button mStartBtn;
- private ProgressBar bar;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- initCom();
- }
- private void initCom()
- {
- bar = (ProgressBar)findViewById(R.id.progressBar1);
- mStartBtn = (Button) findViewById(R.id.button_start);
- mStartBtn.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- // 第一次把线程加入消息队列
- handler.post(updateBarThread);
- }
- });
- }
- Handler handler = new Handler()
- {
- public void handleMessage(android.os.Message msg)
- {
- //handler更新UI
- bar.setProgress(msg.arg1);
- handler.post(updateBarThread);
- };
- };
- Runnable updateBarThread = new Runnable()
- {
- int i = 0;
- @Override
- public void run()
- {
- i = i + 10;
- Message msg = handler.obtainMessage();
- msg.arg1 = i;//用arg1,提高性能
- handler.sendMessage(msg );
- //睡眠1秒
- try
- {
- Thread.sleep(1000);
- }
- catch (InterruptedException e)
- {
- e.printStackTrace();
- }
- if (i == 100)
- {
- handler.removeCallbacks(updateBarThread);
- }
- }
- };
- }
xml中进度条:
- <ProgressBar
- android:id="@+id/progressBar1"
- style="@android:style/Widget.ProgressBar.Horizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
Timer与Handler:
- public class MainActivity extends Activity
- {
- protected static final int NUM_1 = 1;
- private TextView textView;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- initCom();
- }
- private void initCom()
- {
- textView = (TextView) findViewById(R.id.textView);
- Timer timer = new Timer();
- timer.schedule(new TimerTask()
- {
- @Override
- public void run()
- {
- Message msg = new Message();
- msg.arg1 = 1;
- handler.sendMessage(msg);
- }
- }, 2000);
- }
- Handler handler = new Handler()
- {
- public void handleMessage(android.os.Message msg)
- {
- // handler更新UI
- switch (msg.arg1)
- {
- case NUM_1:
- textView.setText("test");
- break;
- default:
- break;
- }
- };
- };
- }