2016-12-08 3 views
0
나는 아래의 코드를 사용하고

activity class : 안드로이드 : 메모리 누수

public static Activity list_Addresses_Activity; 

그리고 나는이에서 사용되는 내 onCreate에서

:

:

list_Addresses_Activity = this; 

를하지만 오류가 발생합니다 제품은 아래와 같은

Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run) 

내에서 이것을 사용할 것이므로 static에서 사용해야합니다.. 내 CloseActivies.class

:

public class CloseActivies { 
    Activity a; 
    Activity b; 
    Activity c; 

    protected void CLSActivities(Activity ListAddresses, Activity ListOrder, Activity SendReports) { 
     a = ListAddresses; 
     b = ListOrder; 
     c = SendReports; 
     if (ListAddressesActivity.FlagLiveAddress && a != null) { 
      Log.e("ADASFSDAGWEG", "X"); 
      a.finish(); 
      ListAddressesActivity.FlagLiveAddress = false; 
     } 
     if (ListOrderActivity.FlagLiveOrder && b != null) { 
      Log.e("ADASFSDAGWEG", "Y"); 
      b.finish(); 
      ListOrderActivity.FlagLiveOrder = false; 
     } 
     if (SendReportsActivity.FlagSendReport && c != null) { 
      Log.e("ADASFSDAGWEG", "Z"); 
      c.finish(); 
      SendReportsActivity.FlagSendReport = false; 
     } 
    } 

    protected void CLSActivities() { 
     if (ListAddressesActivity.FlagLiveAddress && a != null) { 
      Log.e("ADASFSDAGWEG", "X"); 
      a.finish(); 
      ListAddressesActivity.FlagLiveAddress = false; 
     } 
     if (ListOrderActivity.FlagLiveOrder && b != null) { 
      Log.e("ADASFSDAGWEG", "Y"); 
      b.finish(); 
      ListOrderActivity.FlagLiveOrder = false; 
     } 
     if (SendReportsActivity.FlagSendReport && c != null) { 
      Log.e("ADASFSDAGWEG", "Z"); 
      c.finish(); 
      SendReportsActivity.FlagSendReport = false; 
     } 
    } 
} 
+0

정적 변수가 클래스 영역에 있고 특정 객체 내에 있지 않기 때문에 따라서 객체가 해제 되더라도 정적 변수는 메모리에서 공간을 차지합니다. – Vinodh

+0

Service 클래스에서 activity 인스턴스가 필요한 이유에 대한 정보를 좀 더 제공 할 수 있습니까? –

+0

@Abhishek V. 내 코드가 크다. 죄송합니다. –

답변

0

당신은 당신이 의도에 전달할 수 있습니다 정적 변수 중 하나에 대한 활동 기준이 필요하면이 작업을 수행하는 방법은 서비스에 매개 변수로 활동의 참조를 전달하고이

public class MyIntentService extends IntentService { 

    private final WeakReference<Context> mContextWeakReference; 

    public MyIntentService() { 
     super("MyIntentService"); 
    } 

    public static void startActionFoo(Context context) { 
     mContextWeakReference = new WeakReference<>(context); 
     Intent intent = new Intent(context, MyIntentService.class); 
     context.startService(intent); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Context context = mContextWeakReference.get(); 
     if(context != null) { 
      //do your work as since context is not null means 
      //activity is still present and if activity is dismissed 
      //context will come null 
     } 
    } 
} 

같은 WeakReference를 뭔가에 저장됩니다 엑스트라 또는 활동의 정적 함수를 호출하려는 경우 브로드 캐스트 리시버가 더 좋은 선택입니다. 입니다.

0

당신은 활동에서 서비스를 시작하고 서비스 활동의 일부 데이터를 사용하는 경우. 그것들을 의도적으로 전달할 수 있습니다.

Intent intent = new Intent(this,MyService.class); 
    intent.putExtra("data", "some_value"); 
    startService(intent); 
활동이 기각 아니라 쓰레기 수집하더라도 그것은, 안전한 별도의 스레드에서 작업 메모리에 인스턴스를 유지합니다 활동에 대한 정적 참조를 전달하고 서비스 클래스로 메모리 누수의 원인이됩니다