繁体   English   中英

在设定的时间后删除对话框

[英]Removing a dialog after a set amount of time

public void isWaitingResponse (boolean isWaiting) {

    if (isWaiting && dialogLock == null) {

        dialogLock = new Dialog(this, android.R.style.Theme_Panel);
        dialogLock.setCancelable(false);
        dialogLock.show();

        // ToDo: If this dialog is still showing after 10 seconds
        // Call the primary method within and activate the "else"
        // condition code below to remove dialog, and clear app
        // state for further communication

        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (isWaiting && dialogLock != null) {
                    // Recursively call this method as false
                    isWaitingResponse(false);
                }
            }
        }, 5000);

    } else if (!isWaiting) {

        if (dialogLock != null) {

            dialogLock.dismiss();
            dialogLock = null;

        }

    }

}

正如上面代码中的注释所指出的,这确实有效,并且可以正确执行我需要的操作。 我只是想知道我是否要附加处理程序,或者是否需要进行任何其他清理以确保活动代码中不会留下垃圾。 不太熟悉处理程序。

更新:我想确保如果关闭对话框(此方法输入的参数为false),则该处理程序不会触发。 因此,如果进行错误检查,则如果处理程序的发布延迟,则该处理程序应与对话框一起关闭。 我必须确保上一个请求的发布延迟超时不会拒绝以后的请求。

已解决,答案由我自己发布-感谢Yessine。

在显示对话框后,输入此代码,它将在10秒钟后运行

 new Timer().schedule(new TimerTask() {
     public void run() {
     dialogLock.dismiss();
      }}, 10000);//time in milliseconds

此答案是@Yessine Mahdouani的建议的实现。

首先创建一个计时器:

final Timer timerUnlock = new Timer();

在锁定过程时,还涉及安排计时器事件,该事件重新启动根方法本身:

if (isWaiting &&
        lockDialog == null)
{
    lockDialog = new Dialog(this, android.R.style.Theme_Panel);
    lockDialog.setCancelable(false);
    lockDialog.show();

    timerUnlock.schedule(new TimerTask() {
        @Override
        public void run() {
            // Close it automatically if running.
            m_setisWaiting(false);
        }
    }, 10000);
}

解锁时,请确保取消任何计时器,这可以防止先前的锁定计时器解锁尚未完成且尚未超时的最新锁定:

else if (!isWaiting)
{
    if (lockDialog != null) {
        lockDialog.dismiss();
        lockDialog = null;
    }

    timerUnlock.cancel();
}

最后,将在接口级别上运行的代码应在主线程上运行(否则将导致连续崩溃-可能是因为计时器正在完成并从单独的线程触发:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // Remove any timeouts still running.
        if(progressBar != null) {
            if(isWaiting)
                progressBar.setVisibility(View.VISIBLE);
            else
                progressBar.setVisibility(View.GONE);
        }
    }
});

完整方法如下:

public void m_setisWaiting (boolean isWaiting) {

    final Timer timerUnlock = new Timer();

    if (isWaiting &&
            lockDialog == null)
    {
        lockDialog = new Dialog(this, android.R.style.Theme_Panel);
        lockDialog.setCancelable(false);
        lockDialog.show();

        timerUnlock.schedule(new TimerTask() {
            @Override
            public void run() {
                // Close it automatically if running.
                m_setisWaiting(false);
            }
        }, 10000);
    }

    else if (!isWaiting)
    {
        if (lockDialog != null) {
            lockDialog.dismiss();
            lockDialog = null;
        }

        timerUnlock.cancel();
    }

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // Remove any timeouts still running.
            if(progressBar != null) {
                if(isWaiting)
                    progressBar.setVisibility(View.VISIBLE);
                else
                    progressBar.setVisibility(View.GONE);
            }
        }
    });

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM