Call Us: (028)3336 13 96 - Mail: contact@swansoft.ir

 

8 دلیل که باعث نشت حافظه در اپلیکیشن اندروید شما می شود.(بخش دوم)

 

 

در بخش قبلی 4 عامل از 8 عاملی که باعث افتادن شما در دام نشت حافظه می شوند را باهم بررسی کردیم حال 4 عامل بعدی را باهم بررسی میکنیم.

 5. هندلر ها ( Handlers)

قواعد مورد قبل نیز در مورد پردازش های پس زمینه که به صورت ناشناس ( Anonymously) توسط یک شی runnable تعریف شده اند و یک هندلر آنها در صف اجرا قرار داده باشد، قابل تعمیم است. شی runnable به صورت ضمنی (implicitly) یک رفرنس از Activity که در آن تعریف شده است در خود نگه میدارد و سپس به صورت یک پیغام به MessageQueue هندلر ارسال می شود. تا زمانی که این پیغام قبل از نابود شدن Activity به کار گرفته نشود (handling) زنجیره رفرنس ها باعث باقی ماندن Activity در حافظه می شوند و در نتیج نشت آن را موجب می شوند.

 

void createHandler() {
    new Handler() {
        @Override 
        public void handleMessage(Message message) {
            super.handleMessage(message);
        }
    }.postDelayed(new Runnable() {
        @Override 
        public void run() {
            while(true);
        }
    }, Long.MAX_VALUE >> 1);
}
View hButton = findViewById(R.id.h_button);
hButton.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick(View v) {
        createHandler();
        nextActivity();
    }
});

 

 

6. نخ ها (Threads)

اشتباه مورد قبل را می توان عینا با Thread و  TimerTask تکرار کرد.

 

void spawnThread() {
    new Thread() {
        @Override 
        public void run() {
            while(true);
        }
    }.start();
}

View tButton = findViewById(R.id.t_button);
tButton.setOnClickListener(new View.OnClickListener() {
  @Override 
  public void onClick(View v) {
      spawnThread();
      nextActivity();
  }
});

 

 

7. TimerTask

تا زمانی که این ابجکت ها به صورت Anonymous تعریف و نمونه سازی شوند ، بدون توجه به این که اتفاقات در یک thread دیگر رخ می دهد ، یک زنجیره رفرنس به اکتیویتی ( که در آن ایجاد شده )  بعد از نابود شدن آن اکتیویتی در خود نگه میدارد که موجب نشت می شود.

 

void spawnThread() {
    new Thread() {
        @Override 
        public void run() {
            while(true);
        }
    }.start();
}

View tButton = findViewById(R.id.t_button);
tButton.setOnClickListener(new View.OnClickListener() {
  @Override 
  public void onClick(View v) {
      spawnThread();
      nextActivity();
  }
});

 

 

8. Sensor Manager

و اما آخرین مورد، سرویس هایی هستند که می توانید با استفاده از Context و صدا زدن متد getSystemService به آنها دسترسی پیدا کنید.این سرویس ها در یک پردازش جداگانه قرار دارند و جهت انجام پردازش های پس زمینه و یا استفاده به عنوان یک واسط برای دسترسی به سخت افزار موبایل به کار می روند. در صورتی که Context بخواهد از هر رخداد با خبر شود باید خود را به عنوان یک listener ثبت کند. هرچند ، این باعث می شود که سرویس یک رفرنس به Activity را در خود نگه دارد و در صورتی که برنامه نویس فراموش کند که رفنرنسی که به عنوان listener به سرویس داده است را قبل از نابود شدن Activity حذف کند امکان زباله روبی اکتیویتی از حافظه نخواهد بود و باعث نشت حافظه می شود.

 

void spawnThread() {
    new Thread() {
        @Override 
        public void run() {
            while(true);
        }
    }.start();
}

View tButton = findViewById(R.id.t_button);
tButton.setOnClickListener(new View.OnClickListener() {
  @Override 
  public void onClick(View v) {
      spawnThread();
      nextActivity();
  }
});

 

 

 

 

 
 
 

نوشتن دیدگاه

تصویر امنیتی
تصویر امنیتی جدید