【问题标题】:ScheduledExecutorService as timeout shows no AlertDialogScheduledExecutorService 作为超时显示没有 AlertDialog
【发布时间】:2013-05-14 10:11:06
【问题描述】:

我正在尝试在我的应用中实现超时行为。在超时实际发生前 5 秒还应该有一个警告(alertdialog)。

我想使用 ScheduledExecutorService 来执行此操作。

到目前为止,这是我的相关代码:

private final Context context = this;

private ScheduledExecutorService sExService = Executors.newScheduledThreadPool(2);

private RunnableScheduledFuture<?> sFutureTimeout;
private RunnableScheduledFuture<?> sFutureDisconnect;

private final Runnable timeoutRunnable = new Runnable(){
    @Override
    public void run() {     
        showTimeoutAlertDialog();
    }   
};
private final Runnable disconnectRunnable = new Runnable(){
    @Override
    public void run() {
        disconnect();   
    }   
};

以及处理超时行为的方法:

private void setTimeout(){
    sFutureTimeout = (RunnableScheduledFuture<?>) sExService.schedule(timeoutRunnable, 5, TimeUnit.SECONDS);
}

setTimeout 在 onCreate() 中被调用,所以应用应该在启动后 5s 断开连接。

private void showTimeoutAlertDialog(){

    new AlertDialog.Builder(context)
            .setTitle("Disconnect in 5s")
            .setCancelable(false)
            .setPositiveButton("Abort",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            sFutureDisconnect.cancel(false);
                            setTimeout();
                        }
                    }).show();  

    sFutureDisconnect = (RunnableScheduledFuture<?>) sExService.schedule(disconnectRunnable, 5, TimeUnit.SECONDS);
}

这是我面临的问题:

  • 如果“setTimeout”中调用的runnable设置为“disconnectRunnable”,则运行正常,应用在5s后断开连接。

  • 当我将其设置为 'timeoutRunnable' 时,不会显示 alertDialog + 应用程序永远不会断开连接,即使在“showTimeoutAlertDialog”中 5 秒后应该调用 'disconnectRunnable'!?

我认为这里的 ScheduledExecutorService 出了点问题,但我找不到解决方案。

感谢您的帮助:)

【问题讨论】:

    标签: java android timeout android-alertdialog scheduledexecutorservice


    【解决方案1】:

    您试图不从 UI 线程显示 AlertDialog,因此它永远不会工作 从在计划线程池中创建的工作线程调用方法 showTimeoutAlertDialog()。您可以使用Handler 来达到您的目的:

    public class MyActivity extends Activity {
    
        private final Context context = this;
    
        private static Handler mHandler = new Handler();
    
        private final Runnable timeoutRunnable = new Runnable(){
            @Override
            public void run() {
                showTimeoutAlertDialog();
            }
        };
        private final Runnable disconnectRunnable = new Runnable(){
            @Override
            public void run() {
                disconnect();
            }
        };
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            setTimeout();
        }
    
        private void disconnect() {
            Log.e("MyActivity", "Disconnected");
        }
    
        private void setTimeout(){
            mHandler.postDelayed(timeoutRunnable, 5000);
        }
    
        private void showTimeoutAlertDialog(){
    
            new AlertDialog.Builder(context)
                    .setTitle("Disconnect in 5s")
                    .setCancelable(false)
                    .setPositiveButton("Abort",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int id) {
                                    mHandler.removeCallbacks(disconnectRunnable);
                                    setTimeout();
                                }
                            }).show();
    
            mHandler.postDelayed(disconnectRunnable, 5000);
        }
    }
    

    【讨论】:

    • 谢谢。我之前尝试过使用处理程序。我不知道 .removeCallbacks(r) 方法:)
    • 还有一个问题:现在线程呢?整个超时行为现在在 ui 线程上运行,不是吗?如果是,是否有将超时功能保留在单独线程中的解决方法?
    • 如果这里将执行长时间运行的作业,您可以在disconnect() 方法中启动一个新线程。 mHandler.postDelayed(...) 不会阻塞 UI 线程,它只会将 Runnable 放在消息队列中并将其延迟指定时间。如果你愿意,你也可以从这个 Runnable 开始一个新的线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多