0

这段代码意味着如果我单击一个按钮,进度条从 0 开始到 100%。当我在进度条达到 100% 之前单击一个按钮时,我想让进度条重置。

这是我的代码的一部分。

此代码是按钮侦听器。

public void Cal_btn(View v) {

    Message msg;
    switch (v.getId()) {
        case R.id.Square:
            if (Number.getText().toString().length() == 0) {
                Toast.makeText(getApplicationContext(), "숫자를 입력하세요.", Toast.LENGTH_LONG).show();
            } else {
                pThread = new ProThread(pHandler);
                pThread.setDaemon(true);
                pThread.start();

                Cal_Result.setVisibility(View.GONE);
                progress.setVisibility(View.VISIBLE);
                msg = new Message();
                msg.what = 1;
                msg.arg1 = Integer.parseInt(Number.getText().toString());
                mThread.mBackHandler.sendMessage(msg);
            }
            break;
    }
}

这段代码是处理程序。

Handler pHandler = new Handler(){

    public void handleMessage(Message msg){
        if(msg.what == 3){
            if(msg.arg1 == 100){
                Cal_Result.setVisibility(View.VISIBLE);
                progress.setVisibility(View.GONE);
            }else{
                progress.setProgress(msg.arg1);
            }
        }
    }
};

这段代码是线程运行代码。

class ProThread extends Thread{
    int proNum = 0;
    Handler pHandler;
    ProThread(Handler handler){
        pHandler = handler;
    }

    public void run(){
        while(proNum != 100) {
            proNum++;
            Message msg = new Message();
            msg.what = 3;
            msg.arg1 = proNum;
            pHandler.sendMessage(msg);
            try {
                Thread.sleep(10);
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
4

1 回答 1

0

添加一个布尔成员变量作为“ProgressBar”是否启动的标记。

boolean isProgressBarRun;

单击按钮时,更改此变量的状态。如果第一次单击该按钮,则发送一条消息。当您处理消息时,在您的“public void handleMessage(Message msg)”方法中每 10 毫秒重新发送一次消息。

你的 onClick 方法可以写成如下:

boolean isProgressBarRun = false;

...

public void Cal_btn(View v) {

    Message msg;
    switch (v.getId()) {
        case R.id.Square:
            if (Number.getText().toString().length() == 0) {
                Toast.makeText(getApplicationContext(), "숫자를 입력하세요.", Toast.LENGTH_LONG).show();
            } else {
                if (isProgressBarRun) {
                    isProgressBarRun = false;
                    msg = new Message();
                    msg.what = 4; // to stop the progress bar
                    mThread.mBackHandler.sendMessage(msg);
                    msg.what = 3;
                    msg.arg1 = Integer.parseInt(Number.getText().toString());
                    mThread.mBackHandler.sendMessage(msg);
                } else {
                    isProgressBarRun = true;
                    Cal_Result.setVisibility(View.GONE);
                    progress.setVisibility(View.VISIBLE);
                    msg = new Message();
                    msg.what = 1;
                    msg.arg1 = Integer.parseInt(Number.getText().toString());
                    mThread.mBackHandler.sendMessage(msg);
                }
            }
            break;
    }
}

您的处理程序可以更改如下:

Handler pHandler = new Handler(){
    public void handleMessage(Message msg){
        if(msg.what == 4){
            progress.setVisibility(View.GONE);
        } else {
            progress.setProgress(msg.arg1);
            Message message = new Message();
            message .what = 3;
            message .arg1 = msg.arg1 + 1;
            pHandler.sendMessageDelayed(message, 10);
        }
    }
};

总之,你不需要实现 Thread。上面的代码不正确,请看概念。

于 2018-01-30T09:28:42.990 回答