今天在学Handler,写了段点击OK 读进度条,读完后跳转的代码有两个问题:
1 在注释1的地方,如果把注释去掉,就会报错,也就是说进度条读完后,执行将进度条隐藏的命令会报错,是为什么?
2 读完进度条,跳转到另一个Activity后,按back键,无法回到第一个Activity,这又是为什么呢?
package com.progressbartest;import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.os.Message;
import android.widget.*;
import android.content.*;
import android.os.*;public class ProgressBarTest extends Activity {
    /** Called when the activity is first created. */ Button button_ok;
Button button_cancel;
ProgressBar progressbar;
MyHandler myHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        HandlerThread handlerThread =  new HandlerThread("handler_thread");
        handlerThread.start();
        myHandler = new MyHandler(handlerThread.getLooper());
        
        button_ok = (Button)findViewById(R.id.ok);
        button_cancel = (Button)findViewById(R.id.cancel);
        progressbar = (ProgressBar)findViewById(R.id.progressbar);
       
        button_ok.setOnClickListener(new button_okListener());
        button_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
myHandler.removeCallbacks(progressThread);
}
});
    } class MyHandler extends Handler {

MyHandler(){}
MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
progressbar.setProgress(msg.arg1);

if(msg.arg1 >= 100){
/*注释1  progressbar.setVisibility(ProgressBar.INVISIBLE);*/
myHandler.removeCallbacks(progressThread);

Intent intent = new Intent();
intent.setClass(ProgressBarTest.this, ListViewTest.class);
ProgressBarTest.this.startActivity(intent);
}

myHandler.post(progressThread);
}
}

    Runnable progressThread = new Runnable(){
     int i = 0;
@Override
public void run() {
// TODO Auto-generated method stub
i+=8;
Message msg = myHandler.obtainMessage();
msg.arg1 = i;

try{
Thread.sleep(300);
}catch(InterruptedException e){
e.printStackTrace();
}

myHandler.sendMessage(msg);
}
};


class button_okListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
progressbar.setVisibility(ProgressBar.VISIBLE);
myHandler.post(progressThread);
}
}
}

解决方案 »

  1.   

    1 我的程序读完进度条并跳转到另一个Activity,这一阶段执行没问题,但是如果在跳转之前,加上将进度条隐式显示的语句时,就会报错退出。2 读完进度条,跳转到另一个Activity后,按back键,无法回到第一个Activity,这又是为什么呢?出现这两个问题是否和线程方面的东西有关?
      

  2.   

    出现第一个问题我觉得跟线程有关,比较运用HandlerThread后产生的是一个新的线程,而跟activity不是同一个线程,所以得先结束handler 然后再进行跳转吧 个人意见
      

  3.   

     if(msg.arg1 >= 100){
                    }
    在这个IF的最后面加个return就好了
    if(msg.arg1 >= 100){
    ........
    return
    }
      

  4.   


    不知道为什么,只要 progressbar.setVisibility(ProgressBar.INVISIBLE); 语句出现在带有handler语句的代码块里,通通会报错,不管在哪里我是通过 @Override
    protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    progressbar.setVisibility(ProgressBar.INVISIBLE);
    System.out.println("ProgressBar is invisible");
    }这个方法,在激活了另一个Activity之后,设置进度条消失,然后回来就看不到了。
      

  5.   

    现在我的问题是想加入一个监听器
    在点击之后提前停止线程的运行 这个不知道怎么实现根据我的观察,removeCallbacks是把线程移出消息队列
    但是线程还没有结束 还在继续运行,也就是说我的button_cancel.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    myHandler.removeCallbacks(progressThread);
    progressbar.setVisibility(ProgressBar.INVISIBLE);
    }
    });执行后,虽然进度条消失了,但是i还是在不断自增,超过100时跳转到另一个Activity。
    睡觉先了