2016-06-22 17 views
1

Ich benutze den folgenden Code, um einige Arbeit nach jedem Zeitintervall zu bekommen, und Post-Verzögerung in 'endlich' Klausel und outsid von Runnable. Hier ist der Code.Was passiert, wenn ich try catch und schließlich runable für den Handler benutze?

Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      try { 
       // do somthing 
      } catch (Exception e) { 
       // TODO: handle exception 
      } finally { 
       handler.postDelayed(this, 60000); 
      } 
     } 
    }; 
    handler.postDelayed(runnable, 60000); 

handler.postDelayed(runnable, 60000); wird zweimal oder einmal ausgeführt.

Antwort

2

kommt drauf an!

  • erste Frage

, wie die jeweils try/catch/finally-Block normal oder abrupt beendet?

finally-Block "immer ^" ausführt, wenn der try-Block

verlässt Dadurch wird sichergestellt, dass der finally-Block selbst tritt auf, wenn eine unerwartete Ausnahme ausgeführt wird.

^ Ausnahme von oben - schließlich nicht ausgeführt werden kann, wenn Jvm Exits oder Gewinde

für Details getötet wird sehen Java-Spezifikationen:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2

  • zweite Frage

Wie Handler post/postDelayed ausgeführt wird, wird übergeben ? oder scheitert? aus irgendeinem Grund - zum zweiten kann dies geschehen, wenn die Nachricht nicht in die Nachrichtenwarteschlange gestellt wurde - bei einem Fehler, normalerweise, weil der die Nachrichtenwarteschlange verarbeitende Greifer austritt.

aber höchstwahrscheinlich Ihre Aussage wird eine Endlosschleife

** ps machen.Sie müssen eine Ausnahme in try Block oder remove catch Block (wie try {} schließlich {}) kann existieren "ohne" catch, aber Code in catch-Block ohne steigende Ausnahme wird einen Compiler beschweren (Code wird nicht kompilieren)

wenn Sie wollen Schleife n-mal + 1 Sie müssen einige Zustand vor postDelayed in Runnable Lauf hinzufügen() -Methode

in Ihrem Fall Code Flow Ausführung:

  1. postDelayed Methode von den letzten Zeile außerhalb Definition von runnable
  2. ausführ tion von runnable von:
    • Beginn try-Block
    • mit oder ohne
    • durch schließlich mit postDelayed in runnable run() Methode Sperranschlag Passing - Weicht für die verzögerte Ausführung auf Haupt-Thread in Nachricht que runnable statt
  3. dann Endlosschleife auf 2

also sollte ich remove last postDelay out Seite der run() Methode, um postDelay zu erreichen, führe nur Einsen in einer Schleife aus. - AndroidMob

Sie können dies in einer solchen Art und Weise schreiben:

final Handler handler = new Handler(); 
    handler.post(new Runnable() { 

     // this int will also be passed to method post delayed 
     // as "this" keyword applies to Anonymous Class 
     // which body contains everything between brackets of new Runnable() { ... } 
     int withThis = 1; 

     @Override 
     public void run() { 
      handler.postDelayed(this,1000); 
     } 
    }); 

also wo soll ich anrufen Methode Somthing getan? in run() Methode ..? - AndroidMob

hängt dies auch , was Sie erreichen wollen:

Beispiel

handler.post(new Runnable() { 

     int counter = 0; 

     @Override 
     public void run() { 

      boolean wasPlacedInQue = false; 

      doPreMethod(); 

      if(counter =< 10) { 
        doMethod(); 
        wasPlacedInQue = handler.postDelayed(this,1000); 
      } 

      if(wasPlacedInQue) { 
        counter++; 
        doPostyMethod(); 
      } else doFailureMethod(); 

     } 

den Code in run() Methode synchron auf sogenannten UI-Thread ausgeführt wird - i‘ ts Hauptfaden, der Ihre Anwendung ausführt, finden Sie unter:

https://developer.android.com/training/multiple-threads/communicate-ui.html

wenn Sie daran interessiert sind, es zu studieren mehr ich habe für Sie ein komplettes Arbeitsbeispiel gemacht:

https://gist.github.com/c3ph3us/7d237d540e60597369856cb1fa652a23

+0

so sollte ich letzte postDelay out Seite der Methode run() entfernen zu erreichen postDelay Einzigen laufen in einer Schleife. – AndroidMob

+0

und ja, ich möchte dies mit ... endless loop – AndroidMob

+0

@AndroidMob - se mein bearbeiten – ceph3us

-1

wird es sicherlich zweimal laufen. Weil sie zwei verschiedene Nachrichten sind und der Handler sie getrennt behandelt.