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()
。使用
处理程序