功能:

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);");

}

}

};


}

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>

 

 

例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);
            }
        }
    }
}

运行成功。

posted on 2011-05-12 17:40  snowdrop  阅读(5534)  评论(0编辑  收藏  举报