2014-10-23 4 views
4

Android에서 일부 앱을 만들었고 정적 메서드를 사용하는 것으로 나타났습니다.Android에서 정적 메소드 사용?

예를 들어, 나는 PreferenceFragment을 확장하는 클래스가 있습니다. 이 PreferenceFragment에서 나는 ButtononClick 이벤트를 설정했습니다.

Button btn = new Button(getActivity().getApplicationContext()); 
    btn.setText("Save"); 
    v.addView(btn); 
    btn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      SettingsActivity.finishActivityWithResultOkey();    
     } 
    }); 

그때 나는이 Activity 완료 내 SettingsActivity의 정적 메소드를 호출하고 있습니다. 이것은 내가하고 싶은 일을하는 좋은 방법인가? 아니면 더 나은 해결책이 있습니까?

+0

에이 코드를 가하고있는 조각의 클래스를 참조 좋은 방법은 액티비티를 끝내는 메소드가 인스턴스 메소드이기 때문입니다. 귀하의 경우에는 간단하게'getActivity.finish()'를 호출하여 활동을 완료 할 수 있습니다. – njzk2

+0

나는 당신이 나를 잘못 생각했다고 생각합니다. 내가 위에 게시 한 코드는 PrefFragment라는 이름의 클래스이며이 SettingsAcivity를 끝내기 위해 SettingsActivity라는 다른 Acivity의 정적 메서드를 호출합니다. – zFr3eak

+0

다른 활동을 마치려고하십니까? 하나는 표시되지 않습니까? 좋은 생각이 아닙니다. 아시다시피, 그 활동은 이미 시스템에 의해 파괴되었을 수 있습니다. – njzk2

답변

2

올바르게 사용하지 않을 경우 static 방법은 "메모리 누수"으로 이어질 수 있습니다 (메모리는 더 정확하게, 자바 같은 프로그래밍 언어 관리). 나는 메모리 누수에 대한 순수한 정의가 아니기 때문에 "메모리 누수"를 인용했습니다. C++에서 메모리에서 일부 항목을 제거하고 그 참조를 잃어 버리는 것을 잊었습니다 (따라서 나중에 쉽게 지울 수 없습니다 - 적어도 쉽게는), 더 이상 참조가 필요하지 않을 때 참조를 유지하고 GC가 해당 메모리를 지우는 일을하지 못하게하는 것이 더 좋습니다. 이 문제를 다루는 웹에 많은 기사가 있습니다 ("Android 정적 메모리 누수"검색). 이에 대해 질문을받은 다른 많은 질문이 있으므로 ([static][Android][memory-leaks] tags 참조) 여기에 대해서는 설명하지 않겠습니다.

특정 사례를 들어

가능한 메모리 누수를 방지하기 위해, 당신은의 경우처럼 (말에 SettingsActivity를 캐스팅, 익명 OnClickListener 객체가 MyFragmentClass.this.getActivity()을 사용하여에 연결되어있는 Fragment 개체에서 Activity를 얻을 수 있습니다 여기에) .finishActivityWithResultOkey()으로 전화하십시오. 캐스팅도 잘 지켜주는 것이 가장 좋습니다. 참고로

btn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      final Activity activity = MyFragmentClass.this.getActivity(); 
      if(activity instanceof SettingsActivity) 
       ((SettingsActivity)activity).finishActivityWithResultOkey(); 
      else 
       throw new IllegalStateException("This OnClickListener requires a SettingsActivity to start the fragment containig it"); //helps with debugging 
     } 
    }); 

: 여기

코드가 같을 수있는 방법의 예 MyFragmentClass이 그렇지 않은 당신이 :)

+0

당신 코드를 방금 시도했는데 작동 중입니다! 그러나 나는 이유를 이해할 수 없다! 어떻게 활동이 SettingsAcivity의 인스턴스가 될 수 있습니까? – zFr3eak

+1

글쎄,'SettingsActivity'는 프래그먼트를 만드는데 사용했던 활동이 아니십니까? '단편.getActivity()는 그것을 만드는 데 사용 된 액티비티를 반환합니다. –

+0

아, 지금 고마워요! 그러나 정적 메서드를 사용하고 솔루션이 작동하지 않는 다른 예제를 보여 드리겠습니다. 내 finishActivityWithResultOkey() 메서드에서 내 appWidgetProvider에서 defaultSharedPreferences를 사용하여 데이터베이스를 만들고 AlarmManager를 통해 알람을 시작하는 다른 정적 메서드를 호출하려고합니다. 내 AppWidgetProvider에서 정적 메서드없이 어떻게해야합니까? 고맙습니다 ... – zFr3eak

3

미러링이라고하는 Java 속성을 사용할 수 있습니다. 아래에서 속성을 사용하여 활동을 마칩니다.

안드로이드에서
Button btn = new Button(getActivity().getApplicationContext()); 
    btn.setText("Save"); 
    v.addView(btn); 
    btn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      SettingsFragment.this.getActivity().finish();    
     } 
    }); 
+0

'SettingsActivity.this.finish()'는 존재하지 않을 수있는'Activity'를 나타냅니다 (이 코드가'Activity'에 들어 있지 않다면). 또한 코드가'Activity'에 있으면 리스너로 사용되는 익명 클래스에서'finishActivityWithResultOkey'를 사용할 수 있습니다. 질문자는 코드에 'Fragment'코드가 있다고 명시 했으므로 작동하려면 'Fragment'에서'Activity '를 가져와야 할 수 있습니다 : MyFragmentClass.getActivity(). finish() –

+0

what 당신에 대해 얘기하고있다 – user2001693

+1

나는 upvote를 편집 한대로 제거했다. (upvote로 바꿨다. 지금 유효한 답변이다.) 편집하기 전에 당신은 당신의 대답 (''SettingsFragment'' 대신에'SettingsActivity'을 사용하고 있습니다 : http://stackoverflow.com/posts/26534852/revisions) –