功能:
1、进度条进度>100时候,停止。
2、可以点击停止键,随时停止,再点开始,又会继续开始走进度条
注意:
功能1,只要控制好,是不用移除的,只需要>100的时候,不再sendMessage即可。
功能2,要想可以随时停止,分4种情况:
(1)post和sendMessage都不加delay
(2)post带延迟;只需要在点击停止的代码里面,remove进程即可。
(3)sendMessage带延迟;只需要在点击停止的代码里面,remove消息即可。
(4)post和sendMessage都加delay;需要在点击停止的代码里面,remove消息和remove进程,这样才能保证随时点,随时停
代码:
java:
package com.handler.test9;
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;
//这个程序目前为止,是好的!!!
publicclass HandlerTest9 extends Activity {
/** Called when the activity is first created. */
private Button btnStart;
private Button btnEnd;
private ProgressBar mProgressBar;
privateint myProgress;
privatestaticfinal String TAG ="HandlerTest8";
publicint myMessage=11;
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button) findViewById(R.id.buttonstart);
btnEnd = (Button) findViewById(R.id.buttonend);
btnStart.setOnClickListener(myBtnListener);
btnEnd.setOnClickListener(myBtnListener);
mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
}
OnClickListener myBtnListener =new OnClickListener() {
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
if (v.getId() == R.id.buttonstart) {
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar.setMax(100);
mHandler.post(myThread);
Log.v(TAG,"onclick---mHandler.post(myThread);");
} elseif (v.getId() == R.id.buttonend) {
mHandler.removeMessages(myMessage);
Log.v(TAG,"$$$$$mHandler.removeMessages(myMessage);");
//用remove进程的方法不能让这个进度条停止。目前还想不通为什么????
mHandler.removeCallbacks(myThread);
Log.v(TAG,"$$$$$$mHandler.removeCallbacks(myThread);-----stop;");
}
}
};
Runnable myThread =new Runnable() {
@Override
publicvoid run() {
// TODO Auto-generated method stub
if(myProgress<100){
myProgress +=10;
//Message mMessage = mHandler.obtainMessage();
Message mMessage =new Message();
mMessage.what = myMessage;
mMessage.arg1 = myProgress;
Log.v(TAG,
"$$$$$$before----mHandler.sendMessageDelayed(mMessage, 2000)");
//执行这一句,前后是没有时间偏差的,会先发,2s后handleMessage才会执行此消息
mHandler.sendMessageDelayed(mMessage, 2000);
Log.v(TAG,
"$$$$$$after----mHandler.sendMessageDelayed(mMessage, 2000)"+mMessage.arg1);
/* mHandler.sendMessage(mMessage);
Log.v(TAG,
"$$$$$mHandler.sendMessage(mMessage),,,,,,mMessage.arg1=="
+ mMessage.arg1);*/
}else{
//以下两个方法都可以停掉progress。
/*mHandler.removeCallbacks(myThread);
Log.v(TAG,"$$$$$$mHandler.removeCallbacks(myThread);;;;;;$$$$$$myProgress>90=="+myProgress);*/
// mHandler.removeMessages(myMessage);
// Log.v(TAG,"$$$$$$mHandler.removeMessages(myMessage);;;;;;;$$$$$$myProgress>90=="+myProgress);
//不用remove把?应该已经没有了,只要不再sendMessage就可以了把
Log.v(TAG,"$$$$$$$$ttttttttttttttttttttt");
}
}
};
Handler mHandler =new Handler() {
publicvoid handleMessage(Message msg) {
if (msg.what == myMessage) {
// mHandler.post(myThread);
mHandler.postDelayed(myThread, 3000);
mProgressBar.setProgress(msg.arg1);
/* Log.v(TAG,"$$$$$$$mProgressBar.setProgress(msg.arg1);(msg.arg1)=="
+ msg.arg1+"mHandler.post(myThread);");*/
Log.v(TAG,"$$$$$$$mProgressBar.setProgress(msg.arg1);(msg.arg1)=="
+ msg.arg1+"mHandler.postDelayed(myThread, 3000);");
}
}
};
}
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;
//这个程序目前为止,是好的!!!
publicclass HandlerTest9 extends Activity {
/** Called when the activity is first created. */
private Button btnStart;
private Button btnEnd;
private ProgressBar mProgressBar;
privateint myProgress;
privatestaticfinal String TAG ="HandlerTest8";
publicint myMessage=11;
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button) findViewById(R.id.buttonstart);
btnEnd = (Button) findViewById(R.id.buttonend);
btnStart.setOnClickListener(myBtnListener);
btnEnd.setOnClickListener(myBtnListener);
mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
}
OnClickListener myBtnListener =new OnClickListener() {
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
if (v.getId() == R.id.buttonstart) {
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar.setMax(100);
mHandler.post(myThread);
Log.v(TAG,"onclick---mHandler.post(myThread);");
} elseif (v.getId() == R.id.buttonend) {
mHandler.removeMessages(myMessage);
Log.v(TAG,"$$$$$mHandler.removeMessages(myMessage);");
//用remove进程的方法不能让这个进度条停止。目前还想不通为什么????
mHandler.removeCallbacks(myThread);
Log.v(TAG,"$$$$$$mHandler.removeCallbacks(myThread);-----stop;");
}
}
};
Runnable myThread =new Runnable() {
@Override
publicvoid run() {
// TODO Auto-generated method stub
if(myProgress<100){
myProgress +=10;
//Message mMessage = mHandler.obtainMessage();
Message mMessage =new Message();
mMessage.what = myMessage;
mMessage.arg1 = myProgress;
Log.v(TAG,
"$$$$$$before----mHandler.sendMessageDelayed(mMessage, 2000)");
//执行这一句,前后是没有时间偏差的,会先发,2s后handleMessage才会执行此消息
mHandler.sendMessageDelayed(mMessage, 2000);
Log.v(TAG,
"$$$$$$after----mHandler.sendMessageDelayed(mMessage, 2000)"+mMessage.arg1);
/* mHandler.sendMessage(mMessage);
Log.v(TAG,
"$$$$$mHandler.sendMessage(mMessage),,,,,,mMessage.arg1=="
+ mMessage.arg1);*/
}else{
//以下两个方法都可以停掉progress。
/*mHandler.removeCallbacks(myThread);
Log.v(TAG,"$$$$$$mHandler.removeCallbacks(myThread);;;;;;$$$$$$myProgress>90=="+myProgress);*/
// mHandler.removeMessages(myMessage);
// Log.v(TAG,"$$$$$$mHandler.removeMessages(myMessage);;;;;;;$$$$$$myProgress>90=="+myProgress);
//不用remove把?应该已经没有了,只要不再sendMessage就可以了把
Log.v(TAG,"$$$$$$$$ttttttttttttttttttttt");
}
}
};
Handler mHandler =new Handler() {
publicvoid handleMessage(Message msg) {
if (msg.what == myMessage) {
// mHandler.post(myThread);
mHandler.postDelayed(myThread, 3000);
mProgressBar.setProgress(msg.arg1);
/* Log.v(TAG,"$$$$$$$mProgressBar.setProgress(msg.arg1);(msg.arg1)=="
+ msg.arg1+"mHandler.post(myThread);");*/
Log.v(TAG,"$$$$$$$mProgressBar.setProgress(msg.arg1);(msg.arg1)=="
+ msg.arg1+"mHandler.postDelayed(myThread, 3000);");
}
}
};
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/buttonstart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始"/>
<Button
android:id="@+id/buttonend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止"/>
<ProgressBar
android:id="@+id/progressbar"
style="?android:progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/buttonstart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始"/>
<Button
android:id="@+id/buttonend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止"/>
<ProgressBar
android:id="@+id/progressbar"
style="?android:progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
例2和例3:
2012-05-11 android4.0.4上
例2:只有开始,让进度条加法在另一个Thread里面进行
package com.handler.test2; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; 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 HandlerTest2Activity extends Activity { /** Called when the activity is first created. */ private Button btnStart; // private Button btnEnd; private ProgressBar mProgressBar; // private int myProgress; private static final String TAG = "HandlerTest2"; //public int myMessage = 11; // private Thread myThread; // private boolean flag = false; private Handler mHandler; private SubHandler subHandler = null; // private Thread progressThread; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnStart = (Button) findViewById(R.id.buttonstart); // btnEnd = (Button) findViewById(R.id.buttonend); btnStart.setOnClickListener(myBtnListener); // btnEnd.setOnClickListener(myBtnListener); mProgressBar = (ProgressBar) findViewById(R.id.progressbar); HandlerThread handlerThread = new HandlerThread("srx-ssthread"); handlerThread.start(); mHandler = new MyHandler();// 主线程 subHandler = new SubHandler(handlerThread.getLooper());// 子线程 } OnClickListener myBtnListener = new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub if (v.getId() == R.id.buttonstart) { mProgressBar.setVisibility(View.VISIBLE); mProgressBar.setMax(100); Log.v(TAG, "$$$$$$MainThread--id=="+ Thread.currentThread().getId()); subHandler.sendEmptyMessage(2); } } }; class SubHandler extends Handler { int percent = 0; public SubHandler(Looper looper) { super(looper); } public void handleMessage(Message msg) { Log.v(TAG, "$$$$$$progress thread--id=="+ Thread.currentThread().getId()); // TODO Auto-generated method stub if(msg.what ==2){ percent += 10; // mProgressBar.setProgress(percent);//在这里也行,
因为ProgressBar的内部机制如果在主线程里面,就在主线程里面更新,如果不在主线程里面,从当前线程sendMessage给主线程,让主线程更新。
所以这里把ProgressBar放到主线程或者其他线程里面更新都不会抛出异常。 mHandler.sendEmptyMessage(percent); } }; }; class MyHandler extends Handler { /* public MyHandler(Looper looper) { super(looper); }*/ @Override public void handleMessage(Message msg) { // here update UI // TODO Auto-generated method stub super.handleMessage(msg); Log.v(TAG, "$$$$$$Myhandler--2id=="+ Thread.currentThread().getId()); if (msg.what >= 90) { mHandler.removeMessages(msg.what); }else{ mProgressBar.setProgress(msg.what); subHandler.sendEmptyMessageDelayed(2, 2000); } } } }
例2运行成功
让计算percent的计算都在固定id号的Thread里面进行,而不是每次都new 一个新的Thread,用完之后就丢弃,
这也就是HandlerThread的intent所在。
例3,开始和停止,
package com.handler.test3; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; 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 HandlerTest3Activity extends Activity { /** Called when the activity is first created. */ private Button btnStart; private Button btnEnd; private ProgressBar mProgressBar; private static final String TAG = "HandlerTest3"; private Handler mHandler; private SubHandler subHandler = null; private static int UPDATE = 2; int percent = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnStart = (Button) findViewById(R.id.buttonstart); btnEnd = (Button) findViewById(R.id.buttonend); btnStart.setOnClickListener(myBtnListener); btnEnd.setOnClickListener(myBtnListener); mProgressBar = (ProgressBar) findViewById(R.id.progressbar); mProgressBar.setVisibility(View.VISIBLE); mProgressBar.setMax(100); sumsg = new Message(); HandlerThread handlerThread = new HandlerThread("srx-ssthread"); handlerThread.start(); mHandler = new MyHandler();// 主线程 subHandler = new SubHandler(handlerThread.getLooper());// 子线程 } OnClickListener myBtnListener = new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub if (v.getId() == R.id.buttonstart) { Log.v(TAG, "$$$$$$onClick--start--Thread--id==" + Thread.currentThread().getId()); subHandler.sendEmptyMessage(UPDATE); } else if (v.getId() == R.id.buttonend) { Log.v(TAG, "$$$$onClick--stopThread--id==" + Thread.currentThread().getId()); if (mHandler.hasMessages(percent)) { mHandler.removeMessages(percent); } if (subHandler.hasMessages(2)) { subHandler.removeMessages(2); } } } }; class SubHandler extends Handler { // int percent = 0; // msg = new Message(); public SubHandler(Looper looper) { super(looper); } public void handleMessage(Message msg) { Log.v(TAG, "$$$$$$progress thread--id==" + Thread.currentThread().getId()); // TODO Auto-generated method stub if (msg.what == UPDATE && percent < 100) { percent += 10; // mProgressBar.setProgress(percent); mHandler.sendEmptyMessage(percent); } }; }; class MyHandler extends Handler { @Override public void handleMessage(Message msg) { // here update UI // TODO Auto-generated method stub super.handleMessage(msg); Log.v(TAG, "$$$$$$Myhandler--2id==" + Thread.currentThread().getId() + "progress==" + msg.what); if (msg.what >= 100) { mHandler.removeMessages(msg.what); mHandler.removeMessages(2); } else { mProgressBar.setProgress(msg.what); subHandler.sendEmptyMessageDelayed(2, 2000); } } } }
运行成功。