如何在执行命令后才能睡觉?

时间:2015-11-09 16:05:51

标签: java android

我有一个DialogFragment,有一个公共接口和一个保存回调的方法:

public class ChooseExportTypeDialogFragment extends DialogFragment{
    public interface ExportTypeClickListener{
        public void doPositiveClick(ExportTypeEnum exportType);
    }

    public void setOnConfirmClickListener( ExportTypeClickListener callback ){
        this.callback = callback;
    }
    //...
}

我声明DialogFragment这样:

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块中,希望sleep只在完成toast.show()之后启动,但同样的问题会发生

我还尝试将toast.show()放入一个帖子中,然后.start().join()。然后再拨打onExport()。同样的问题

如何显示toast,然后让onExport()开始?

1 个答案:

答案 0 :(得分:0)

在Android线程中执行时,Thread.sleep在Android中特别有问题,因为它可能导致其他元素(在您的情况下为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();
}

您可能还需要在等待吐司文本完成时禁用对话框按钮的可点击性。