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

Popular posts from this blog

python - Selenium remoteWebDriver (& SauceLabs) Firefox moseMoveTo action exception -

html - How to custom Bootstrap grid height? -

transpose - Maple isnt executing function but prints function term -