So schließen Sie ein Fenster/Aktivität nach einer gewissen Inaktivität

Ich bin der Gestaltung einer music player app für Android-mit pop-up-Kontrollen. Ich bin derzeit versuchen, um diese Steuerelemente zu schließen nach einer bestimmten Zeit der Inaktivität, aber es scheint nicht zu sein, eine klar dokumentierte Methode, dies zu tun. So weit ich habe es geschafft, cobble folgende Lösung zusammen mit ein paar Vorschläge, sowohl aus dieser Website und anderen.

private Timer originalTimer = new Timer();

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.playcontrols);

    View exitButton = findViewById(R.id.controls_exit_pane);
    exitButton.setOnClickListener(this);
    View volUpButton = findViewById(R.id.controls_vol_up);
    volUpButton.setOnClickListener(this);
    View playButton = findViewById(R.id.controls_play);
    playButton.setOnClickListener(this);
    View volDownButton = findViewById(R.id.controls_vol_down);
    volDownButton.setOnClickListener(this);

    musicPlayback();

    originalTimer.schedule(closeWindow, 5*1000);    //Closes activity after 10 seconds of inactivity

}

Sowie der code, sollte das Fenster schließen

//Closes activity after 10 seconds of inactivity
public void onUserInteraction(){
    closeWindow.cancel();   //not sure if this is required?
    originalTimer.cancel();
    originalTimer.schedule(closeWindow, 5*1000);
}

private TimerTask closeWindow = new TimerTask() {

    @Override
    public void run() {
        finish();
    }
};

Dem obigen code macht das vollkommen Sinn für mich, aber es Kraft schließt auf jegliche Interaktion mit dem Benutzer. Es hat jedoch in der Nähe in der Regel, wenn unberührt und wird sich nicht schließen, nachdem die Interaktion, wenn ich entfernen Sie die zweite Liste, also das scheint das problem zu sein. Beachten Sie auch, dass ich mir vorstellen, werde ich in dieser timing-Aufgabe zu einem anderen thread zu helfen, halten Sie die Benutzeroberfläche bissig. Ich brauche, um es arbeiten jedoch zuerst :D. Wenn du noch mehr info, die ich brauche zu liefern bitte Fragen und danke für jede Hilfe...Ihr Jungs sind Brillant!

  • Verwenden adb logcat, DDMS, oder die DDMS-Perspektive in Eclipse zu prüfen, LogCat und Blick auf die stack-trace in Verbindung mit Ihrem "force close".
  • Anstatt Timer und TimerTask ich würde empfehlen, mit einem Handler und postDelayed() zu planen Runnable aufgerufen werden, nachdem Ihre Periode zu verzögern. Wenn es Interaktion mit dem Benutzer, können Sie removeCallbacks() auf die Zeitplanung aufheben der Runnable und verwenden postDelayed() um wieder einplanen. Der Vorteil ist, dass Sie die Kontrolle über die wichtigsten Anwendungs-thread, in der Erwägung, dass TimerTask ist auf einem hintergrund-thread, und das ist wahrscheinlich die Ursache für deinen Absturz.
  • Noch immer verwenden, um diese...nie benutzt logcat vor...gib mir die folgende Ausgabe: E/AndroidRuntime( 3835): FATAL EXCEPTION: main-E/AndroidRuntime( 3835): java.lang.IllegalStateException: Timer wurde storniert E/AndroidRuntime( 3835): bei java.util.Timer.scheduleImpl(Timer).java:566) E/AndroidRuntime( 3835): bei java.util.Timer.Zeitplan(Timer).java:463) E/AndroidRuntime( 3835): bei org.stephenfin.zoomplayer.PlayerControls.Beweislast erInteraction(PlayerControls.java:69)
  • Also...was ist auf der Linie 69 von Ihrem PlayerControls Klasse?
  • Es war der timer Abbrechen() rufen. Nicht sicher, warum, aber er war nicht glücklich darüber, abgesagt. Der handler wie erwartet funktioniert aber und ist scheinbar eine bessere Lösung
InformationsquelleAutor stephenfin | 2011-02-14
Schreibe einen Kommentar