0

Я тестирую свое приложение с помощью инструмента MAT и обнаруживаю, что есть утечка памяти, но я не смог найти его в коде. Пожалуйста, помогите мне на том же.Утечка памяти Android в действии

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

package intent.sample; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class IntentA extends Activity implements OnClickListener { 
    Handler handler = new Handler(); 
    private Intent i; 
    private Button button; 

    public void onClick(View src) { 
     if (src == (View) button) { 
      i = new Intent(this, IntentSampleActivity.class); 
      handler.postDelayed(new Runnable() { 

       public void run() { 
        startActivity(i); 
       } 
      }, 20000); 
     } 
    } 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main1); 
     button = (Button) findViewById(R.id.screen2button); 
     button.setOnClickListener(this); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     this.finish(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     this.finish(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     handler = null; 
     i = null; 
     this.finish(); 
    } 
} 

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

package intent.sample; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class IntentSampleActivity extends Activity implements OnClickListener { 

    private Button button; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     button = (Button) findViewById(R.id.screen1button); 
     button.setOnClickListener(this); 
    } 

    public void onClick(View scr) { 
     if (scr == (View) button) { 
      Intent ii = new Intent(this, IntentA.class); 
      startActivity(ii); 
     } 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     this.finish(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     this.finish(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     this.finish(); 
    } 
} 

Я создаю новый поток и начать деятельность. Будет ли это создавать новый экземпляр класса активности?

+0

Я присвоил null моему обработчику в методе Ondestroy, но я не уверен, что начальный поток создаст новое действие с тем же экземпляром или создаст новый экземпляр? – Prem

+0

Вы действительно не должны называть 'finish()' из 'onPause()', 'onStop()' или 'onDestroy()'. Это не только нарушает жизненный цикл стандартного приложения, но 'onDestroy()', в частности, будет когда-либо вызываться только в том случае, если активность уже завершена. – derekerdmann

+0

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

ответ

0

В этом коде каждый раз, когда я запускаю действие, создается новый экземпляр. Чтобы этого избежать, мне нужно использовать режим запуска в файле android manifest.xml для этой активности. режим запуска может быть отдельной задачей или единственным экземпляром.

Большое спасибо в любом случае.

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