Java 如何仅在执行命令后睡眠?
我有一个Java 如何仅在执行命令后睡眠?,java,android,Java,Android,我有一个对话框片段,带有一个公共接口和一个保存回调的方法: public class ChooseExportTypeDialogFragment extends DialogFragment{ public interface ExportTypeClickListener{ public void doPositiveClick(ExportTypeEnum exportType); } public void setOnConfirmClickLi
对话框片段
,带有一个公共接口和一个保存回调的方法:
public class ChooseExportTypeDialogFragment extends DialogFragment{
public interface ExportTypeClickListener{
public void doPositiveClick(ExportTypeEnum exportType);
}
public void setOnConfirmClickListener( ExportTypeClickListener callback ){
this.callback = callback;
}
//...
}
我声明一个对话框片段
,如下所示:
final ChooseExportTypeDialogFragment chooseExportTypeDialogFragment = new ChooseExportTypeDialogFragment();
chooseExportTypeDialogFragment.setOnConfirmClickListener( new ExportTypeClickListener() {
@Override
public void doPositiveClick( ExportTypeEnum exportType ) {
toast.setText("Preparing Export...");
toast.show();
controller.onExport( adapter.getSelected() , exportType);
chooseExportTypeDialogFragment.dismiss();
}
} );
chooseExportTypeDialogFragment.show( controller.getSupportFragmentManager(), "notification" );
在方法onExport()
中,我执行了一个Thread.sleep(3000)
(除其他外)
似乎在调用doPositiveClick()
时,睡眠(在onExport()
中)发生在toast.show()之前。我试图将这两个操作(toast.show()
和.onExport()
)放入synchronized
块中,希望睡眠只在完成toast.show()
后才开始,但同样的问题也发生了
我还尝试将toast.show()
放在一个线程中,然后将.start()
和.join()
放在线程中。然后才调用onExport()
。同样的问题
如何显示toast
,然后才让onExport()
启动?线程。在Android中,尤其是在UI线程中执行睡眠时,它会导致其他元素(在您的情况下是toast)停止响应。解决此问题的另一种方法是在处理程序中执行controller.onExport()逻辑
@Override
public void doPositiveClick( ExportTypeEnum exportType ){
toast.setText("Preparing Export...");
toast.show();
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
controller.onExport( adapter.getSelected() , exportType);
}
}, 3500);
chooseExportTypeDialogFragment.dismiss();
}
在等待toast文本完成时,您可能还需要禁用对话框按钮的可单击性。哦,天哪,不要在主线程上执行Thread.sleep()。这将真正停止整个应用程序并将其冻结3秒钟。如果您希望在关闭对话框时等待3秒钟,那么请使用处理程序和.postDelayed(),这会更干净,而且不会冻结UI。我的目标不是仅在toast完成后才执行onExport()
。我只想展示祝酒词,然后立即开始onExport()
。在onExport()
内部,我执行一些shell命令,之后需要某种睡眠,然后继续执行onExport()
中的其他内容。如果是这样的话,为什么不将onExport内部的处理程序移动到需要“等待”的特定操作?我们将尝试这样做。感谢大家,与流行的观念相反,LENGTH\u LONG
不是秒数,它只是一面旗帜。据我所知,没有办法知道祝酒的实际持续时间。好吧,我选择这个答案作为一种方法,尽管这不是确切的解决方案。答案就像每个人说的:不要使用Thread.sleep()
。使用处理程序
。