2017-07-26 4 views
0

私はスケジューラを設定して、あらかじめ定義された時間の後にポップアップを表示したいと思います。ScheduledExecutorからAlertDialogを表示するには?

次の例では、「スケジュールされたアラート」ログが1回印刷されますが、アラートダイアログは表示されません。

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); 
     } 
} 

初期化はメインアクティビティの内部にあります。

なぜダイアログが表示されないのですか?

ボタンを自分のビューに追加し、そのボタンに明示的な警告ダイアログをリンクすると、それは機能します。だから、一般的にダイアログコードはうまくいくはずです。

+0

本当にコンパイルできますか?新しいAlertDialog.Builder(this) 'Runnableのインスタンスの' this'をins'tしますか? – lelloman

+0

activity.runOnUiThread –

+0

のアラートを表示するようにしてください。これはコンパイルされません。 –

答えて

1

あなたのコードの問題は、UIスレッドからダイアログを表示しようとしていることです。あなたが必要とするすべては10秒で、ダイアログの表示を遅らせることであり、それはそれをであるかどう

、あなたは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(); 
    } 
}; 

を使用して、それが

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    handler.postDelayed(showDialogRunnable, 10000); 
... 

あなたならば投稿することができますあなたが呼び出すことができる予定された実行をキャンセルしたい

handler.removeCallbacks(showDialogRunnable); 

事は、もしあなたがpコンストラクタは、あなたがあなたの活動を維持したい場合は、この場合には、それは

更新

UIスレッドになり、呼び出されているThreadに関連付けられているLooper使用してconstuctorでLooperHandlerお尻クリーナー、あなたは例えば、

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(); 
    } 
} 

をそのRunnableを実装する別のクラスを作成し、あなたの活動でそれをインスタンス化でき

private final Runnable showDialogRunnable = new AlertDialogShower(this); 
+0

独自のクラスで 'AlertDialog'定義をどのように抽出できますか?私は 'MainActivity.this'を呼び出すことはできません... – membersound

+0

そこからMainActivity.thisを使用することができます。ハンドラとshowDialogRunnableはMainActivityクラスのフィールドです – lelloman

+0

私の' MainActivity'クラスをきれいに保ち、 showDialogRunnable'フィールドはそのクラスの外にありますが、警告ダイアログビルダはありますか?それとは別に、コードは期待通りに動作します、ありがとう! – membersound

1
private void initAlert() { 
    final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); 
    executor.schedule(new Runnable() { 
     @Override 
     public void run() { 
      Log.i("app", "scheduled alert"); 
      YourActivity.this.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        new AlertDialog.Builder(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(); 
       } 
      }); 

     } 
    }, 10, TimeUnit.SECONDS); 
} 
+0

Hm、スケジューラ内の 'Runnable'の中に' Runnable'をラップするだけで、非同期警告を表示するのは奇妙です。それは動作しますが。 – membersound

+0

このケースでは、警告を表示する最も簡単な方法です –

+0

これが解決策です。アクティビティのフィールドとして常にRunnableを宣言できます – lelloman

関連する問題