我有一个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()
开始?
答案 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();
}
您可能还需要在等待吐司文本完成时禁用对话框按钮的可点击性。