2010-06-13 8 views
2

Je suis en train de faire un gestionnaire simple exception globale dans mon application Android et j'avoir des problèmes:accèderont à « ce » dans les méthodes anonymes

public class TicTacToe extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 

     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      Toast.makeText(this, "TOAST", Toast.LENGTH_LONG); 

     } 
    }); 

    setContentView(R.layout.main); 
    } 
} 

Je suis assez nouveau à la fois Android et Java, mais dans .NET qui fonctionnerait. Je ne peux pas accéder à la variable locale à partir de méthodes anonymes dans Java? Si oui, comment dois-je le réécrire?

Merci, Vitaly

Répondre

10

Vous pouvez, mais pas de cette façon. this fait référence à l'objet UncaughtExceptionHandler.

changement this à TicTacToe.this

Aussi, vous devriez avoir une erreur de compilation. Ce n'est pas?

+0

Hi. Vous avez raison. J'ai eu une erreur de compilation, désolé de ne pas l'avoir posté. Quoi qu'il en soit, il semble que cela a aidé. Merci. – VitalyB

+0

Pour élaborer un peu, quand vous faites cela, vous êtes en train de former une nouvelle classe. Il a un fichier .class (ou l'équivalent Dalvik je suppose) et tout. Donc "ceci" est l'instance de cette classe. Google "classe interne anonyme" pour plus d'informations. – MatrixFrog

2

Comme mentionné dans une autre réponse, l'astuce est this est ombrée. Une autre façon de contourner cela est d'ajouter une méthode dans la classe externe qui renvoie this.

Il se rend compte que cela remonte un peu la signature de la classe, mais si vous gardez la méthode privée, cela ne semble pas être une grosse affaire. Est-ce que quelqu'un a des commentaires sur comment c'est mieux ou pire que d'autres solutions?

public MyOuterClass { 

    private MyOuterClass getThis() { 
    return this; 
    } 

    private void outerClassMethod(new MyAnonymousClass() { 
    public void anonymousClassMethod() { 
     doSomething(getThis()); 
    } 
    }); 
} 
+2

pourquoi quelqu'un utiliserait-il cette manière obscure, quand il y a une manière appropriée? – unbeli

Questions connexes