【发布时间】:2013-12-28 19:03:06
【问题描述】:
我有一个在应用程序第一次运行时弹出指令的活动(在 DialogFragment 中)。
我想在用户不关闭对话框时停止执行代码。
可以吗???
编辑: 我尝试使用 CountDownLatch,但它冻结了我的 UI,并且对话框没有显示。
活动:
private CountDownLatch startSignal;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// open tutorial if need
startSignal = new CountDownLatch(1);
TutorialDialog tutoDial = new TutorialDialog();
tutoDial.show(getSupportFragmentManager(), "tuto");
try {
toast("aguardando");
startSignal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
对话框(我只是放了需要的方法):
公共类 TutorialDialog 扩展 DialogFragment { private final String TAG = getClass().getSimpleName(); 地图活动父活动; SharedPreferences 首选项;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
parentActivity = ((MapActivity) activity);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// setStyle(DialogFragment.STYLE_NORMAL, 0);
AlertDialog.Builder principal = new AlertDialog.Builder(getActivity());
principal.setInverseBackgroundForced(true);
// principal.setTitle(R.string.report);
View view = getActivity().getLayoutInflater().inflate(
R.layout.tutorial, null);
TextView ok = (TextView)view.findViewById(R.id.ok);
ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
parentActivity.resumeCode();
dismiss();
}
});
AlertDialog ad = principal.create();
return ad;
}
}
而在Activity中,方法resumeCode():
公共无效恢复代码(){ startSignal.countDown(); 吐司(“接下来是什么”); }
编辑 2:我实施了几次。我的最后一个实现应该是那个,但它仍然不起作用。我会试着解释它是怎么回事。
mainActivity(主线程)启动dialogFragment:
TutorialDialog tutoDial = new TutorialDialog();
tutoDial.setCancelable(true);
tutoDial.show(getSupportFragmentManager(), "tuto");
然后,在另一个线程中,我在 onPreExecute() 中运行 await():
公共类 GetPlaces 扩展 AsyncTask> {
private ProgressDialog dialog;
// I put it public so that I can reach it from the DialogFragment
public static CountDownLatch startSignal = new CountDownLatch(1);
@覆盖 受保护的无效onPreExecute(){ super.onPreExecute(); 尝试 { startSignal.await(); } 捕捉(InterruptedException e){ // TODO 自动生成的 catch 块 e.printStackTrace(); } 对话框 = 新进度对话框(上下文); dialog.setCancelable(false); dialog.setMessage(context.getString(R.string.loading)); 对话框.isIndeterminate(); dialog.setProgressStyle(R.style.dialogInput); 对话框.show(); }
这样,它不应该在 startSignal 变量达到 0 之前运行
然后,在我的 FragmentDialog 中,当对话框关闭时,我运行:
noTuto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// DISMISS DIALOG
startSignal.countDown();
dismiss();
}
});
所以理论上它应该可以工作,但在丑陋的现实中,我的 FragmentDialog 冻结...
我确定: 1 - 没有 startSignal.await();在应该冻结 UI 的 mainActivity 中 2 - startSignal 变量在另一个线程中定义:
public class GetPlaces extends AsyncTask<Void, Void, ArrayList<Place>>
所以,如果有什么冻结,应该是这个线程,但我不明白为什么我的对话是冻结的。现在,我的对话框不再收到点击...
【问题讨论】:
-
您的对话框未显示的原因是因为您在 UI 线程中调用
startSignal.await();。您的 UI 线程被阻止执行。这就是您的 UI 冻结的原因,并且您的 Dialog 没有机会出现。 -
但是即使我把它放在Dialog的onResume()方法上(它至少应该显示第一个活动,并且在onResume中,渲染应该已经完成了),总是冻结。
-
不要在 UI 线程中调用 startSignal.await()。 (onResume 由 UI 线程执行)也许您应该重新编写代码而不使用 CountDownLatch。就您要实现的目标以及阻止您实现目标的原因提出一个明确的例子。
-
所以,如果我理解得很好,我应该在一个新线程中运行我的 DialogFragment,阻塞主线程,并且由于我的 Dialog 在一个新线程中,我将能够单击一些东西来释放我的用户界面,我说得对吗???
标签: android android-dialogfragment