2017-05-07 4 views
0

Angenommen, Sie haben die folgende Methode. Erstellt es jedes Mal, wenn die Methode aufgerufen wird, eine neue Instanz eines Handler mit einem Looper Objekt? oder läuft es auf demselben Thread?Erstellt ein neuer Handler (Looper.getMainLooper()) jedes Mal eine neue Instanz davon?

private void responseListener 
    new Handler(Looper.getMainLooper()).post(new Runnable() { 
     @Override 
     public void run() { 
     //TODO execeute code 
     } 
    }); 
} 

auf den Antworten Basierend Ich habe den Code dies geändert:

private void responseListener() { 
    if (onBitmapSaveListener != null) { 
     if (handler != null && runnable != null) { 
      handler.removeCallbacks(runnable); 
     } 

     runnable = new Runnable() { 
      @Override 
      public void run() { 
       //TODO execeute code 
      } 
     }; 

     handler.post(runnable); 
    } 
} 
+0

Es schafft eine neue Handler-Instanz, die Beiträge zu den Hauptgreifer – EpicPandaForce

+0

@EpicPandaForce So dies ein schlechter Ansatz ist? – Muddz

+0

Ich meine, du könntest wahrscheinlich nur eine statt einer neuen machen – EpicPandaForce

Antwort

2

Ihr erster Code erstellt ein neues Handler und eine neue Runnable jedes Mal, wenn Sie die Methode aufrufen. Außerdem läuft es jedes Mal auf demselben Thread. Die Looper, die von getMainLooper() zurückgegeben wird, ist das gleiche in allen Anwendungen.

Ihr zweiter Ansatz ist einen Schritt näher, könnte aber Probleme von sich selbst haben.

Richten Sie einfach eine Handler innerhalb Ihrer Initialisierung (am wahrscheinlichsten onCreate()) und verwenden Sie sie erneut. Wenn Runnable keine Variablen aus dem Gültigkeitsbereich der Methode benötigt, machen Sie dasselbe mit. Ansonsten lass diesen Teil einfach so wie er ist.

private final Handler handler = new Handler(Looper.getMainLooper()); 
private void responseListener() { 
    if (onBitmapSaveListener != null) { 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       //TODO execeute code 
      } 
     }); 
    } 
} 
+1

Sie können Inline-Deklaration und Initialisierung ('private endgültige Handler Handler = neue Handler (Looper.getMainLooper());'). Wenn Sie einen Handler mit einem Hauptlooper verwenden, wird dieser immer zum Hauptthread gepostet, Sie können ihn überall initialisieren. –

+0

@tynn Danke. Ich habe schon etwas ähnliches gemacht. Aber nicht mit dem 'final keyword'. Um es in einen Zusammenhang zu stellen: Ich habe mich nur gefragt, ob es in der Art, wie ich es vorher hatte, eine schlechte Leistung wäre. Wie Sie [hier] sehen können (https://github.com/Muddz/ViewToBitmap/blob/master/viewtobitmap/src/main/java/com/muddzdev/viewtobitmaplibrary/ViewToBitmap.java#L175) wird es in meinem kleinen verwendet Bibliothek, die sich mit dem Speichern von Ansichten in Bildern beschäftigt, und der Code wird jedes Mal ausgeführt, wenn der Benutzer in einer App, die meine Bibliothek verwendet, auf eine Schaltfläche zum Speichern klickt. – Muddz

+0

@tynn Freut mich zu hören, dass das ineffecient nun zu efficient geändert wurde. Was ist nicht relevant? – Muddz

Verwandte Themen