Android EditText и OnEditorActionListener — утечка памяти

Я отслеживаю утечку памяти в своем приложении для Android, и этот EditText использует много памяти (2,8 МБ), и его отключение устраняет утечку.

Так может ли кто-нибудь обнаружить (потенциальную) утечку памяти в этом коде? Я нахожу немного проблематичным тот факт, что я никогда не возвращаю true из OnEditorActionListener, поскольку я заменяю фрагмент раньше (или возврат все еще будет вызываться? Я должен выполнить код и проверить это).

Кроме того, может быть, я не закрываю редактор должным образом, просто прячу его?

 public void addHighscoreEdittext()
{   
    final HighscoresDatabaseHandler dbHandler = ( (MainActivity) getActivity() ).theDatabasehandler;

    HighscoreEdittext = new EditText( getActivity() );
    HighscoreEdittext.setX( ( actualScreenSizeX - actualScreenSizeX / 8 * 6 ) / 2 );
    HighscoreEdittext.setY( actualScreenSizeY / 10 * 3 );

    LayoutParams lparams = new LayoutParams( actualScreenSizeX / 8 * 6, actualScreenSizeY / 6 );
    HighscoreEdittext.setLayoutParams( lparams );
    HighscoreEdittext.setInputType( InputType.TYPE_CLASS_TEXT );

    HighscoreEdittext.setBackground( getResources().getDrawable( R.layout.start_finish_button ) );

    HighscoreEdittext.setTextColor( Constants.TEXT_COLOR_ON_TRANSPARENT_BROWN );
    HighscoreEdittext.setHintTextColor( Constants.TEXT_COLOR_ON_TRANSPARENT_BROWN );
    HighscoreEdittext.setHint( "New best time! Enter name..." );

    ((ViewGroup) (getActivity()).findViewById( android.R.id.content )).addView( HighscoreEdittext );

    HighscoreEdittext.setOnEditorActionListener(
        new EditText.OnEditorActionListener() 
        {
            @Override
            public boolean onEditorAction( TextView v, int actionId, KeyEvent event ) 
            {                   
                if ( actionId == EditorInfo.IME_ACTION_DONE )
                {
                    SharedData.GameFinished = false;

                    String name = v.getText().toString();
                    if ( name.length() > 8 )
                    {
                        name = name.substring( 0, 8 );
                    }
                    dbHandler.updateHighscore(
                            new Highscore(
                                    SharedData.LevelPlayed, 
                                    name, 
                                    SharedData.LevelTime ) ); 

                    /* Hide keyboard */
                    HighscoreEdittext.clearFocus();
                    InputMethodManager in = (InputMethodManager) getActivity().getSystemService( Context.INPUT_METHOD_SERVICE );
                    in.hideSoftInputFromWindow( HighscoreEdittext.getApplicationWindowToken(), 
                            InputMethodManager.HIDE_NOT_ALWAYS );

                    ((ViewGroup) getActivity().findViewById( android.R.id.content )).removeView( HighscoreEdittext );

                    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                    fragmentTransaction.replace( R.id.fragment_content, new ChooseLevelFragment(), "chooselevel" );
                    fragmentTransaction.commit();

                    return true;              
                }

                return false;
            }
    });
      }

person Community    schedule 13.03.2014    source источник


Ответы (1)


Где у вас есть fragmentTransaction.commit(). Это может быть проблемой, поскольку фиксация является синхронной задачей и заставит приложение ждать ее. Посмотрите, можете ли вы использовать для этого асинхронную задачу, если вам не нужны данные прямо сейчас.

person user1550266    schedule 22.04.2014