如何在显示Android对话框之前设置超时?

时间:2014-03-19 22:25:57

标签: java android timeout

我正在尝试显示一个对话框,但是在我需要在显示之前设置超时之前,就像你在javascript中使用setTimeout函数一样。有没有办法在Android中用java做到这一点?

我曾尝试使用Timer实例但是在执行代码时我得到了这个异常:

03-19 22:18:19.638: E/AndroidRuntime(2396): FATAL EXCEPTION: Timer-0
03-19 22:18:19.638: E/AndroidRuntime(2396): java.lang.RuntimeException: Can't create       
handler inside thread that has not called Looper.prepare()

这是代码:

            // instantiating a new CustomDialog class
            MyCustomDialog dialog = new MyCustomDialog(thisContext, R.layout.institutional_info_custom_list);
            DetailListView = (ListView) dialog.findViewById(R.id.custom_dialog_list);
            final MasterDetailArrayAdapter adapter = new MasterDetailArrayAdapter(ComeHaInvestito.this, MasterAndDetailstatisticsInfoList);         
            DetailListView.setAdapter(adapter);
            final MyCustomDialog showDialog = dialog;
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {

                @Override
                public void run() {
                    showDialog.show();
                }
            }, 600);
我错了什么?我读到对话框绑定到Acrivity类,所以可能将showDialog.show()调用放在新的TimerClass()中会使它抛出异常?

顺便说一下,执行我所描述的操作的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

  我错了什么?我读到对话框绑定了Acrivity   所以也许把showDialog.show()调用放在新的   TimerClass()使它抛出异常?

问题是TimerTask 在后台线程上运行 - 因此问题->你无法调用任何会改变后台线程的UI状态(例如显示Dialog)的内容。 而是使用Handler和postDelayed()方法:

的伪代码:

int counter = 0;
...
Handler handler = new Handler();
Runnable runnable = new Runnable() {

   public void run() {

       // it will be > 0 when run() will be called twice
       if (counter > 0) {
           dlg.show();

           // it made a trick now remove callbacks from Handler and return
           handler.removeCallbacks(runnable);
           return;
       }

       counter++;
       handler.postDelayed(runnable, 600);

   }
};
runnable.run();

这种方法比runOnUiThread()构造的可能用法更清晰,并且可以例如定期调用,稍作修改。