【问题标题】:Android EditText and OnEditorActionListener - memory leakAndroid EditText 和 OnEditorActionListener - 内存泄漏
【发布时间】:2014-03-13 19:37:33
【问题描述】:

我正在跟踪我的 Android 应用程序中的内存泄漏,此 EditText 使用大量内存 (2.8MB),禁用它会使泄漏消失。

那么任何人都可以在这段代码中发现(潜在的)内存泄漏吗? 我发现我从来没有从 OnEditorActionListener 返回 true 有点问题,因为我之前替换了片段(或者返回仍然会被调用?我应该单步执行代码并检查)。

另外,也许我没有正确关闭编辑器,只是把它藏起来了?

 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;
            }
    });
      }

【问题讨论】:

    标签: android memory-leaks android-edittext android-memory


    【解决方案1】:

    您在哪里有 fragmentTransaction.commit()。这可能是问题,因为提交是一个同步任务,会导致应用程序等待它。如果您不需要立即使用数据,请查看是否可以使用异步任务。

    【讨论】: