我正在尝试显示一个对话框,但是在我需要在显示之前设置超时之前,就像你在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()中会使它抛出异常?
顺便说一下,执行我所描述的操作的最佳方式是什么?
答案 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()
构造的可能用法更清晰,并且可以例如定期调用,稍作修改。