【问题标题】:Progress bar reset when button is re-clicked [closed]重新单击按钮时进度条重置[关闭]
【发布时间】:2018-07-09 01:15:15
【问题描述】:

这段代码意味着如果我单击一个按钮,进度条会从 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();
            }
        }
    }
}

【问题讨论】:

  • 那么问题出在哪里?首先,您在 MainThread 中启动 ProThread。它可能会阻塞 MainThread。您需要再次检查“Handler/MessageQueue”的概念和实现。
  • 尝试禁用按钮点击一次,并在进度条达到 100% 时禁用响应式按钮点击。
  • @yoonhok 当我在进度条达到 100% 之前单击一个按钮时,另一个进度条也会开始。所以两个进度条重叠了,第一次启动的进度条不会停止。
  • @FahadEjazButt 这不是我想要的...
  • 我已经告诉过你,你是直接在 MainThread 中启动 ProThread。您应该实现可运行对象并将其转发到处理程序中,例如: Handler mHandler = new Handler(); mHandler.post(mRunnable);

标签: android multithreading progress-bar android-progressbar android-thread


【解决方案1】:

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

boolean isProgressBarRun;

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

你的 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。 上面的代码不正确,请看概念。

【讨论】:

  • 我没有使用你的代码,但我可以理解我的代码有什么问题。我很好地解决了这个问题。感谢您教授线程概念。
猜你喜欢
  • 2023-01-30
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2013-07-05
相关资源
最近更新 更多