Tüm etkinliklerimin arka planı olarak ayarlamak için bir görüntü kullanıyorum ancak bu bellek taşmasına neden oluyor ve uygulamayı kilitliyordu. Şimdi benim faaliyetlerimde pause() ve Destroy() üzerinde benim drawables çözme ve şimdi geri düğmesine basarak boş ekran gösterir. Ekstra bellek kullanmadan bunu nasıl önleyebilirim. hep VM bize 10MB tahsis izin vermez söyleyerek hafıza taşması hataya neden olan "/ çekilebilir @" = arka plan Şimdi bir bitmap alıyorum: Bağlantıyı çözme onable onPause() yanıt vermiyor geri gezinme ve bu adımı atlamak bellek taşmasına neden olur
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.login_root));
}
protected void onDestroy() {
unbindDrawables(findViewById(R.id.login_root));
super.onDestroy();
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
Başlangıçta ben robot kullanarak düzeni şişirme edildi (app.) o aşağı ölçekleme ve çalışma zamanında bağlama olmadan çizilebilir.Şimdi VM, unbindDrawables (..) kullanmadan 5MB (app.) tahsis etmemize izin vermez diyor Açıkçası, gösterilen arka plan görüntüsü kalitesi azaldı ama mümkün değil 13KB'lik bir png dosyası kullanıyorum, JVM'nin isteği işlemek için 5 veya 10MB'lik bir alan gerektirdiğini anlamak için?
Yerleşim ifadelerimi onCreate() - onResume() yönteminden kaydırıyorum, ancak uygulama geri düğmesine tekrar basıldığında bellekten siliniyor.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected void onResume(){
setContentView(R.layout.home);
Bitmap bmp;
ImageView background = (ImageView)findViewById(R.id.iv_home_background);
InputStream is = getResources().openRawResource(R.drawable.background);
bmp = BitmapFactory.decodeStream(is);
background.setImageBitmap(bmp);
super.onResume();
}
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.home_root));
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
OnDestroy() çağrılırsa onPause() daha önce çağrıldığını unutmayın. –
sadece @OohnSatriano'nun belirttiği gibi "onPause()" da görüldüğü gibi. Ama yine de, onResume işlevinizi bize gösterme –
Devam etme işlevimi geçersiz kılmadım. Orada ne yapacağım konusunda hiçbir fikrim yok. – Atinder