java - 如果发生 onTick 中的条件,则停止 Count DownTimer,然后调用其 onFinish 方法

标签 java android multithreading timer countdowntimer

好吧,我在倒计时器启动之前运行了一个线程,然后当该线程内的变量更改其值时,将触发 onTick() 方法内的条件,该条件将调用 onFinish() 并执行所需的操作,问题是在 onTick() 方法上的条件应用之后,倒计时器将继续运行并多次执行 onFinish() 方法,我尝试使用自定义倒计时计时器允许我取消 onTick() 内的计时器,但它不起作用,应用程序只是挂起,我还尝试添加一个标志,以便在 onTick() 已经执行了 onFinish() 时执行代码一次,但它不起作用,它返回 false 值,有时它会返回到父计时器 PS。我确实有两个倒计时器,我想在其中应用上述过程;是存在于第一个的 onFinish() 中的第二个,代码如下:

cdt=    new CountDownTimer(10000,1000) {//CountDownTimer(edittext1.getText()+edittext2.getText()) also parse it to long

                             public void onTick(long millisUntilFinished) {

                              //here you can have your logic to set text to edittext
                             }

                             public void onFinish() {

                                 if(connectionAccepted!=null){
                                     new CountDownTimer(15000,1000) {//CountDownTimer(edittext1.getText()+edittext2.getText()) also parse it to long

                                         public void onTick(long millisUntilFinished) {if(assignMsg!=null){
onFinish();
//Stop the timer here so it doesn't call onFinish more than once
}

                                          //here you can have your logic to set text to edittext
                                         }

                                         public void onFinish() {
                                             chatClient.interrupt();
                                             try {
                                                serverSocket.close();
                                            } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }
                                             socket.close();
                                             progressDialog.dismiss();
                                             if(assignMsg!=null){
                                                 new AlertDialog.Builder(TicketDetails.this)
                                                    .setIcon(android.R.drawable.ic_dialog_alert)
                                                    .setTitle("Result")
                                                    .setMessage("Task has been: "+assignMsg)
                                                    .setPositiveButton("Ok", null)

                                                .show(); 
                                             }else{
                                                 chatClient.interrupt();
                                                 try {
                                                    serverSocket.close();
                                                } catch (IOException e) {
                                                    // TODO Auto-generated catch block
                                                    e.printStackTrace();
                                                }
                                                 socket.close();
                                                 new AlertDialog.Builder(TicketDetails.this)
                                                    .setIcon(android.R.drawable.ic_dialog_alert)
                                                    .setTitle("Result")
                                                    .setMessage("User didn't respond!")
                                                    .setPositiveButton("Ok", null)

                                                .show(); 
                                             }
                                         }
                                        }
                                        .start();
                                 }else{
                                     chatClient.interrupt();
                                     try {
                                        serverSocket.close();
                                    } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                     socket.close();
                                     progressDialog.dismiss();
                                     new AlertDialog.Builder(TicketDetails.this)
                                        .setIcon(android.R.drawable.ic_dialog_alert)
                                        .setTitle("Result")
                                        .setMessage("Network Error!")
                                        .setPositiveButton("Ok", null)

                                    .show(); 
                                 }
                             }
                            }
                            .start();


            }});

感谢任何帮助。

最佳答案

看起来onFinish()不能在onTick()内部调用,相反,这是你可以做的

@Override
public void onTick(long millisUntilFinished){
    //your code here
    new Handler().post(new Runnable(){
        @Override
        public void run(){
            onFinish();
        }
    });
}

关于java - 如果发生 onTick 中的条件,则停止 Count DownTimer,然后调用其 onFinish 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30235004/

相关文章:

android - 从模块中的build.gradle中删除项目根目录中的文件夹

android - com.google.firebase.firestore.FirebaseFirestoreException : Failed to get document because the client is offline. Android

c++ - 有什么办法可以避免发生堆栈粉碎时终止程序?

c++ - 为什么线程从未作为 C++ 标准的一部分包含在内?

java - 如何在不调用包的情况下调用我在 Java 中创建的变量? (在同一个类(class))

java.util.concurrent.TimeUnit 类设计模式

android - 动态改变Android中按钮的宽度

java - 如何避免在非最终字段上同步?

java - 如何在单元测试中模拟 InitialContext 构造函数

java - 预期为BEGIN_OBJECT,但在第1行第6列处为STRING