android - How to show AlertDialog from ScheduledExecutor? -
i want set scheduler , show popup after predefined time.
in following example, log "scheduled alert" printed once, alert dialog never shown.
public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { //... initalert(this); } private void initalert(activity activity) { final scheduledthreadpoolexecutor executor = new scheduledthreadpoolexecutor(1); executor.schedule(new runnable() { @override public void run() { log.i("app", "scheduled alert"); new alertdialog.builder(activity) .settitle("test") .setmessage("lorep") .setpositivebutton("ok", new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int id) { log.i("app", "ok clicked"); } }) .seticon(android.r.drawable.ic_dialog_alert) .create() .show(); } }, 10, timeunit.seconds); } } the initialization inside main activity.
why dialog not shown?
if add button view, , link alert dialog explicit button click, works. dialog code in general should fine.
the problem of code you're trying show dialog not ui thread.
if need delay display of dialog 10 seconds, , it, can use handler
private final handler handler = new handler(); private final runnable showdialogrunnable = new runnable() { @override public void run() { new alertdialog.builder(mainactivity.this) .settitle("test") .setmessage("lorep") .setpositivebutton("ok", new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int id) { log.i("app", "ok clicked"); } }) .seticon(android.r.drawable.ic_dialog_alert) .create() .show(); } }; and post
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); handler.postdelayed(showdialogrunnable, 10000); ... if want cancel scheduled execution can call
handler.removecallbacks(showdialogrunnable); the thing is, if don't pass looper in constuctor, handler use looper associated thread constructor being called, in case ui thread
update
if want keep activity cleaner, create class implements runnable, example
public class alertdialogshower implements runnable { private context context; public alertdialogshower(context context){ this.context = context; } @override public void run() { new alertdialog.builder(context) .settitle("test") .setmessage("lorep") .setpositivebutton("ok", new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int id) { log.i("app", "ok clicked"); } }) .seticon(android.r.drawable.ic_dialog_alert) .create() .show(); } } and instantiate in activity
private final runnable showdialogrunnable = new alertdialogshower(this);
Comments
Post a Comment