2012-05-17 2 views
1

Я пытаюсь понять концепцию утечек памяти. Я пробовал этот код и пробовал несколько способов найти из соответствующих сообщений, но я не мог решить проблему. Нужна помощь в понимании утечки памяти в этом коде. Мое приложение имеет только 2 действияAndroid Memoryleak в коде

// Первый активность

package com.pace.mat; 

import android.app.Activity; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.Window; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 

public class MATDemoActivity extends Activity implements OnClickListener { 

    private Dialog dialog1; 
    private Button btnSubmit; 
    private Context myClassContext; 
    private ImageView RedImage,BlueImage,Yellow,Orange,Green; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     myClassContext = this; 

     RedImage = (ImageView) findViewById(R.id.Red); 
     BlueImage = (ImageView) findViewById(R.id.Blue); 
     Yellow = (ImageView) findViewById(R.id.Yellow); 
     Orange = (ImageView) findViewById(R.id.Orange); 
     Green = (ImageView) findViewById(R.id.Green); 

     RedImage.setImageResource(R.drawable.red); 
     BlueImage.setImageResource(R.drawable.blue); 
     Yellow.setImageResource(R.drawable.yellow); 
     Orange.setImageResource(R.drawable.orange); 
     Green.setImageResource(R.drawable.green); 

     btnSubmit = (Button)findViewById(R.id.btnSubmitAtFirst); 
     btnSubmit.setOnClickListener(this); 

    } 

    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     if(arg0 == (View)btnSubmit) 
     { 
      dialog1=new Dialog(myClassContext); 
      Window window = dialog1.getWindow(); 
      window.setBackgroundDrawableResource(android.R.color.transparent); 
      window.requestFeature(window.FEATURE_NO_TITLE);      
      dialog1.setContentView(R.layout.progress_indicator); 
      dialog1.show();  

      // Doing a network intensive task 

      if(dialog1 !=null) 
      { 
       dialog1 = null; 
       myClassContext = null; 
       window = null; 
      } 

      Intent i = new Intent(MATDemoActivity.this,SecondActivity.class); 
      startActivity(i); 
     } 
    } 

    @Override 
    public void onStop() {  
     super.onStop(); 
     myClassContext = null; 
     dialog1 = null; 
     RedImage = null; 
     BlueImage = null; 
     Yellow = null; 
     Orange = null; 

     Green=null; 
     this.finish(); 
    }  

    @Override 
    public void onPause() { 
     super.onPause(); 
     myClassContext = null; 
      dialog1 = null; 
      RedImage = null; 
      BlueImage = null; 
      Yellow = null; 

      Orange = null; 
      Green=null; 
     this.finish(); 
    }   

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     myClassContext = null; 
      dialog1 = null; 
      RedImage = null; 
      BlueImage = null; 

      Yellow = null; 
      Orange = null; 
      Green=null; 
     this.finish(); 
    } 

} 

// Вторая активность

package com.pace.mat; 

import android.app.Activity; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.Window; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 

public class SecondActivity extends Activity implements OnClickListener { 

    private Dialog dialog1; 
    private Button btnSubmit; 
    private Context myClassContext1; 
    private ImageView RedImage,BlueImage,Yellow,Orange,Green; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.secondactivity); 

     myClassContext1 = this; 

     RedImage = (ImageView) findViewById(R.id.Red); 
     BlueImage = (ImageView) findViewById(R.id.Blue); 
     Yellow = (ImageView) findViewById(R.id.Yellow); 
     Orange = (ImageView) findViewById(R.id.Orange); 
     Green = (ImageView) findViewById(R.id.Green); 

     RedImage.setImageResource(R.drawable.red); 
     BlueImage.setImageResource(R.drawable.blue); 
     Yellow.setImageResource(R.drawable.yellow); 
     Orange.setImageResource(R.drawable.orange); 
     Green.setImageResource(R.drawable.green); 

     btnSubmit = (Button)findViewById(R.id.btnSubmitAtFirst); 
     btnSubmit.setOnClickListener(this); 
    } 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     if(v == (View)btnSubmit) 
     { 
      dialog1=new Dialog(myClassContext1); 
      Window window = dialog1.getWindow(); 
      window.setBackgroundDrawableResource(android.R.color.transparent); 
      window.requestFeature(window.FEATURE_NO_TITLE);      
      dialog1.setContentView(R.layout.progress_indicator); 
      dialog1.show();  

      // Uploading an Image to network 

      if(dialog1 !=null) 
      { 
       dialog1 = null; 
       myClassContext1 = null; 
       window = null; 
      } 

      Intent i = new Intent(this,MATDemoActivity.class); 
      startActivity(i); 
     } 
    } 

    @Override 
    public void onStop() {  
     super.onStop(); 

     this.finish(); 
    }  

    @Override 
    public void onPause() { 
     super.onPause(); 

     this.finish(); 
    }   

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     myClassContext1 = null; 
      dialog1 = null; 
      RedImage = null; 
      BlueImage = null; 

      Yellow = null; 
      Orange = null; 
      Green=null; 
     this.finish(); 
    } 

} 

// LOG CAT DATA, когда я перехожу с первой на вторую АКТИВНОСТИ

05-17 12:12:43.323: E/WindowManager(2264): Activity com.pace.mat.SecondActivity has leaked window [email protected] that was originally added here 
05-17 12:12:43.323: E/WindowManager(2264): android.view.WindowLeaked: Activity com.pace.mat.SecondActivity has leaked window [email protected] that was originally added here 
05-17 12:12:43.323: E/WindowManager(2264): at android.view.ViewRoot.<init>(ViewRoot.java:247) 
05-17 12:12:43.323: E/WindowManager(2264): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
05-17 12:12:43.323: E/WindowManager(2264): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
05-17 12:12:43.323: E/WindowManager(2264): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
05-17 12:12:43.323: E/WindowManager(2264): at android.app.Dialog.show(Dialog.java:241) 
05-17 12:12:43.323: E/WindowManager(2264): at com.pace.mat.SecondActivity.onClick(SecondActivity.java:54) 
05-17 12:12:43.323: E/WindowManager(2264): at android.view.View.performClick(View.java:2408) 
05-17 12:12:43.323: E/WindowManager(2264): at android.view.View$PerformClick.run(View.java:8816) 
05-17 12:12:43.323: E/WindowManager(2264): at android.os.Handler.handleCallback(Handler.java:587) 
05-17 12:12:43.323: E/WindowManager(2264): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-17 12:12:43.323: E/WindowManager(2264): at android.os.Looper.loop(Looper.java:123) 
05-17 12:12:43.323: E/WindowManager(2264): at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-17 12:12:43.323: E/WindowManager(2264): at java.lang.reflect.Method.invokeNative(Native Method) 
05-17 12:12:43.323: E/WindowManager(2264): at java.lang.reflect.Method.invoke(Method.java:521) 
05-17 12:12:43.323: E/WindowManager(2264): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-17 12:12:43.323: E/WindowManager(2264): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-17 12:12:43.323: E/WindowManager(2264): at dalvik.system.NativeStart.main(Native Method) 
+0

не похоже, что в этом коде есть утечка памяти, возможно, какая-то другая часть кода имеет утечку памяти. также вам не нужно вызывать null для ваших объектов в 'onStop()', 'onPause()'. Это вызовет задержку при возобновлении приложения. – Mayank

+0

Спасибо. Да, я попробовал это только по методу ondestroy, но даже после этого у меня пропала память. Так добавлено и к другим методам. Теперь я опубликую полный код. – Prem

+0

Пример: 'RedImage = (ImageView) findViewById (R.id.Red); 'я вижу, что вы создаете одинаковые объекты изображения в обоих действиях. – Mayank

ответ

1

Ваш код не похож на утечку памяти. и в большинстве случаев утечки памяти происходят из-за , сохраняя долговечную ссылку на Context.

Это хорошая статья Ромена Гая, которая поможет вам понять утечку памяти в деталях. check it out.

Надеюсь, это поможет.

EDIT: в соответствии с вы обновили свой вопрос

После просмотра в вашем журнале его кажется, что нет никакой памяти не просочиться ее окно просочилась исключение. Закройте или отпустите свой диалог, прежде чем завершить свою деятельность. это решит вашу проблему.

+0

Пожалуйста, обратитесь к моим данным журнала, где я вижу утечку памяти. Кроме того, у меня нет какой-либо статической ссылки в моем файле класса, который может содержать постоянную ссылку – Prem

+1

неявная утечка утечки. закрыть или закрыть диалоговое окно, прежде чем завершить свою деятельность. это решит вашу проблему. –

+0

Эй, спасибо. Как только я отклонил диалог, я не получил исключения в log cat. – Prem

0

Похоже, вы вызываете одно действие из другого повторяющегося, это похоже на то, как вы зацикливаетесь на действия и их переключение.

MATDemoActivity называет

Intent i = new Intent(MATDemoActivity.this,SecondActivity.class); 
      startActivity(i); 

, а затем из SecondActivity вы звоните

Intent i = new Intent(this,MATDemoActivity.class); 
     startActivity(i); 

также вы воссоздавать все объекты в каждой деятельности, а не разделяя их между двумя видами деятельности.

попробуйте устранить эти проблемы и посмотреть, работает ли это.

+0

«Вы воссоздаете все объекты в каждом действии» - Как вы это говорите? Можете ли вы предоставить более подробную информацию? – Prem

0

Из журнала я считаю, что причиной проблемы является то, что вы показываете диалог, но не отклоняете его, затем вы назначаете диалог null и начинаете другое действие.

if(dialog1 !=null) 
{ 
    dialog1 = null; 
    myClassContext1 = null; 
    window = null; 
} 

Таким образом, действие приведет к утечке диалогового окна (диалоговое окно - окно). В любом случае, если вам не нужен диалог, вы должны его отклонить.

Смежные вопросы