2016-07-29 12 views
0

Meine Android-App muss nach einer Verzögerung einen Dialog anzeigen. Das Problem ist, dass sich der Kontext zum Zeitpunkt der Anzeige des Dialogfelds möglicherweise geändert hat.Wie kann ich einen Dialog in einem anderen Kontext anzeigen?

Wie kann ich dieses Problem lösen?

Mein Code rechts sieht nun wie folgt aus:

class UpdateRunnable extends Runnable { 
    private Context ctx; 
    UpdateRunnable(Context ctx) { 
     this.ctx = ctx 
    } 
    @Override 
    public void run() { 
     //throws exception: "Unable to add window -- token null is not for an application" 
     AlertDialog.Builder builder = new AlertDialog.Builder(ctx.getApplicationContext()); 
     builder.setTitle("Time to refresh data"); 
     builder.setMessage("Data needs updating"); 
     builder.show(); 
    } 
} 

class MyAvtivity extends AppCompatActivity { 
    @override 
    public void onCreate(...) { 
     Handler updateHandler = new Handler(); 
     updateHandler.postDelayed(new UpdateRunnable(this), 10000); 

     //do some stuff 
     //start another activity 
    } 
} 

Antwort

1

AlertDialog.Builder mit Application funktioniert nicht. Aus diesem Grund erhalten Sie eine ungültige Token-Ausnahme.

Sie müssen also sicherstellen, dass der Kontext Ihrer ausführbaren Datei Ihr aktueller Aktivitätskontext ist, oder versuchen Sie einen anderen Vorgang wie die Verwendung eines Dienstes mit der Logik, wann das Dialogfeld angezeigt wird, und informieren Sie die aktuelle Aktivität Es sollte den Dialog anzeigen oder den Dienst verwenden, um eine Aktivität mit einem Dialog.Theme zu starten, anstatt einen AlertDialog zu verwenden.

0
private Context ctx; 
UpdateRunnable(Activity activity) { this.activity = activity } 

@Override public void run() { 
    if(!activity.isFinishing()){ 
     AlertDialog.Builder builder = new AlertDialog.Builder(activity); 
     builder.setTitle("Time to refresh data"); 
     builder.setMessage("Data needs updating"); 
     builder.show(); 
    } 
} 
+0

Dies wirft keine Ausnahme, aber es zeigt auch nicht das Dialogfeld (weil es versucht, es auf einer Aktivität anzuzeigen, die nicht mehr sichtbar ist) und später das Fenster verliert – B1CL0PS