2010-06-13 6 views
2

내 안드로이드 응용 프로그램에서 간단한 글로벌 예외 핸들러를 할 노력하고있어 나는 문제 데 : 나는 안드로이드와 자바 모두 비교적 새로운 해요액세스 '이'익명 메소드의

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); 
    } 
} 

을하지만, .NET에서 작동합니다. Java의 익명 메소드에서 로컬 변수에 액세스 할 수 없습니까? 그렇다면 어떻게 다시 작성해야합니까?

감사합니다, 비탈리

답변

10

당신은 할 수 있지만 그 방법이다. thisUncaughtExceptionHandler 개체로 참조됩니다.

변경 this

TicTacToe.this에 또한 당신은 컴파일 타임 오류가 있어야합니다. 그렇지 않아?

+0

안녕하세요. 당신이 올바른지. 컴파일 오류가 발생했습니다. 게시하지 않으 셨으니 죄송합니다. 어쨌든 도움이 된 것 같습니다. 감사. – VitalyB

+0

조금 더 자세히 설명하면, 당신은 실제로 새로운 클래스를 형성하고 있습니다. .class 파일 (또는 Dalvik 동등 물)과 모든 것이 있습니다. 그래서 "this"는 그 클래스의 인스턴스입니다. 자세한 내용은 Google "익명 내부 클래스"를 참조하십시오. – MatrixFrog

2

다른 답변에서 언급 한 것처럼 트릭은 this이 음영 처리됩니다. 이 문제를 해결할 수있는 또 다른 방법은 외부 클래스에 this을 반환하는 메서드를 추가하는 것입니다.

이 서명은 클래스 서명을 약간은 깨닫지 만 메소드를 비공개로 유지하면 큰 문제가되지 않습니다. 아무도 다른 솔루션보다 좋고 나쁘다는 의견을 갖고 있습니까?

public MyOuterClass { 

    private MyOuterClass getThis() { 
    return this; 
    } 

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

올바른 방법이있을 때 왜이 모호한 방법을 사용합니까? – unbeli

관련 문제