2010-11-28 2 views
22

Ich habe folgendes:Wie kann ich eine Variable in eine neue RUNNABLE-Deklaration übergeben?

Runnable done = new Runnable() 
    { 
     public void run() 
     { 
      System.out.println("Hello"); 
     } 
    }; 

Und dann in meiner Android Tätigkeit werde ich nenne so etwas wie:

runOnUIThread(done); 

die dann rufe ich. Ich möchte jedoch, dass "Hello" nicht hartcodiert werden, so dass ich es übergeben kann. Andernfalls muss ich eine dieser Deklarationen für jeden String haben, die ich drucken möchte. Auch

(Dies ist eigentlich eine Android Frage, aber es abgespeckt auf grundlegende Java nach unten, so ist es einfacher zu beantworten)

Dank

Antwort

22
final String hello = whereverItsComingFrom; 
Runnable done = new Runnable() 
    { 
     public void run() 
     { 
      System.out.println(hello); 
     } 
    }; 
+0

Nicht die beste Art und Weise, weil, wenn Sie etwas haben, etwa so: public void receivedEvent (Event e) { \t queueEvent (neu Runnable() \t { \t \t public void run() \t \t { \t \t \t System.out.printin (e.message) \t \t } \t}); } Sie haben einen Fehler. –

+3

@gtoknu dann nur Parameter E final machen –

+0

Es wird einen Unterschied machen, um den Parameter als endgültig zu haben? Erkläre bitte weiter! Ich habe darüber nachgedacht, Methoden zu überschreiben, die nicht über einen abschließenden Parameter verfügen, ich sollte eine andere Methode aufrufen, die ein Finale erhält und was die erste Methode tun würde? –

47

In Java (und ich glaube, es ist das gleiche in Android ist), können Sie eine anonyme innere Klasse verwenden, wie von Bart van Heukelom vorgeschlagen. Diese Lösung hat den Vorteil, dass weniger Code geschrieben werden muss und Sie auf Felder und Methoden der äußeren Klasse zugreifen können.

Aber es hat zwei Nachteile:

  • die Variable „Hallo“ hat endgültig sein,

  • die anonyme Klasse eine interne Referenz auf die äußere Klasseninstanz hat - das bedeutet die äußere Klasse wird beibehalten, wenn es ansonsten für die Garbage Collection geeignet wäre. @see: Effective Java [Joshua Bloch], Artikel 22: Favor statische Elementklassen über nicht-statische

Und in meiner bescheidenen Meinung nach, ist es schlechte Praxis eine Klasseninstanz auf diese Weise parametrisieren.

Also ich glaube, solange Sie nicht auf Methoden und Felder der äußeren Klasse zugreifen müssen, ist es besser, eine bestimmte Klasse für diese Aufgabe zu schreiben und es zu einer statischen Elementklasse.

class Demo { 
... 

    private static class MyRunnable implements Runnable { 
    private final String message; 

    MyRunnable(final String message) { 
     this.message = message; 
    } 

    public void run() { 
     System.out.println(message); 
    } 
    } 

    public void startThread() { 
    MyRunnable myRunnable = new MyRunnable("Hello"); 

    runOnUIThread(myRunnable); 
    } 
... 
} 
+1

gibt es eine Multithread-Lösung, wo die "Nachricht" nicht endgültig sein muss? –

+0

Die 'final' Anweisung in diesem Beispiel ist nicht notwendig. - Aber wenn Sie die Runable in mehreren Thread gleichzeitig verwenden, müssen Sie mit Nebenläufigkeitsproblemen umgehen! – Ralph

Verwandte Themen