我有一个活动在应用程序第一次运行时弹出说明(在DialogFragment中)。
我希望在用户不关闭对话框时停止执行代码。
这样做是否可行???
编辑: 我尝试使用CountDownLatch,但它冻结了我的UI,并且Dialog没有显示。
活动:
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();
}
}
}
Dialog(我只是把所需的方法):
公共类TutorialDialog扩展DialogFragment { private final String TAG = getClass()。getSimpleName(); MapActivity parentActivity; 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():
public void resumeCode(){ startSignal.countDown(); 吐司(“什么是下一个”); }
编辑2:我实施了好几次。我的最后一个实现应该是一个,但它仍然不起作用。我将尝试解释它是如何发生的。
mainActivity(主线程)启动dialogFragment:
TutorialDialog tutoDial = new TutorialDialog();
tutoDial.setCancelable(true);
tutoDial.show(getSupportFragmentManager(), "tuto");
然后,在另一个线程中,我在onPreExecute()中运行await():
public class 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);
@覆盖 protected void onPreExecute(){ super.onPreExecute(); 尝试{ startSignal.await(); } catch(InterruptedException e){ // TODO自动生成的catch块 e.printStackTrace(); } dialog = new ProgressDialog(context); dialog.setCancelable(假); dialog.setMessage(context.getString(R.string.loading)); dialog.isIndeterminate(); dialog.setProgressStyle(R.style.dialogInput); dialog.show(); }
这样,它不应该在startSignal变量达到0之前运行
然后,在我的FragmentDialog中,当对话关闭时,我运行:
noTuto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// DISMISS DIALOG
startSignal.countDown();
dismiss();
}
});
所以从理论上讲,它应该有效,但在丑陋的现实中,我的FragmentDialog会冻结......
我确信: 1 - 没有startSignal.await();在mainActivity中应该再冻结UI 2 - startSignal变量在另一个线程中定义:
public class GetPlaces extends AsyncTask<Void, Void, ArrayList<Place>>
所以,如果有任何冻结,它应该是这个帖子,但我不明白为什么我的对话框是冻结的。现在,我的对话框不再收到点击次数了......
答案 0 :(得分:1)
使用CountDownLatch startSignal = new CountDownLatch(1);
您的代码通常会在用户线程中执行。使您的用户线程代码startSignal.await();
,以便它可以暂停执行。
您的DialogFragment
将在UI线程中执行。制作UI线程代码startSignal.countDown()
,以恢复用户线程代码执行。