2015-10-26 1 views
1

Я использую Handler в моих заставках для задержки перенаправления к следующей деятельности следующим образом ..Утечки внутренней памяти Android и утечка по контексту?

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.entrance); 
     screenTimeOut(); 
    } 

    private void screenTimeOut() { 
      /* New Handler to start the next screen 
     * and close this Entrance after some seconds.*/ 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       initTracker(); 
       /* Create an Intent that will start the Next-Activity. */ 
       checkLoginStatus(); 
      } 
     }, SPLASH_DISPLAY_LENGTH); 
    } 

А в другой деятельности передает контекст класса и удержание контекста в том, что следующем на кнопки нажмите ..

private Tools tools; 

tools = new Tools(DetailsScreen.this, true); 

Инструменты

private Context _context; 
    private Fragment _fragment; 
    private Activity activity; 
    private String filePath = null; 
    private String camImagePath = null; 

    public Tools() { 
    } 

    public Tools(Context _context, boolean flag) { 
     this._context = _context; 
     this.activity = (Activity) _context; 
     initPath(); 
     if (flag) { 
      createImageFile(); 
     } 
    } 

Является ли какой-либо из них причиной утечки?

А как насчет использования обработчика следующим образом ..

private Handler mHandler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.entrance); 
     screenTimeOut(); 
    } 

private void screenTimeOut() { 
      /* New Handler to start the next screen 
     * and close this Entrance after some seconds.*/ 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       initTracker(); 
       /* Create an Intent that will start the Next-Activity. */ 
       checkLoginStatus(); 
      } 
     }, SPLASH_DISPLAY_LENGTH); 
    } 


    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     mHandler.removeCallbacksAndMessages(null); 
    } 
+0

Будет 'tools' остаются даже после того, как' DetailsScreen' законченный? – shhp

+0

http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html PLS проверить это http://stackoverflow.com/questions/10864853/when-exactly-is-it-leak -safe-to-use-anonymous-inner-classes, и это тоже – Vaisakh

+0

Nop..Tools объявлено как личное нестатическое поле. @ shhp – Stella

ответ

1
  1. Handler и Runnable не должны использоваться в анонимной форме.
  2. Вам следует избегать передачи всей активности в качестве параметра другим классам. Если контекст - это все, что вы хотите использовать activity.getContext().

Больше информации здесь:
http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html http://www.androiddesignpatterns.com/2013/04/activitys-threads-memory-leaks.html

+0

Спасибо за ответ. Можете разработать его как пример правильного Применение ..? Что-то не так в моем коде? – Stella

+0

Связи, которые я вам отправил, будут подробно рассказывать с примером «обработчик» и «runnable» и как они вызывают утечку памяти. Я не мог дать вам лучший пример. – Henry

+0

Я понял, как использовать обработчики ... но запутался во втором о прохождении контекста. – Stella

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

  • Нет связанных вопросов^_^