2016-04-04 49 views
0

帮助请在我的应用程序中查找内存泄漏。如何在Android应用程序中使用LeakCanary查找内存泄漏?

LeakCanary:

-static android.app.ActivityThread.sCurrentActivityThread

-references android.utill.ArrayMap.mArray

-reference阵列java.lang.Object中[]。 1

-references android.app.ActivityThread $ ActivityClientRecord.activity

-references MainActivity.tf(TF - 我的片段)

-leaks TheaterFragment例如

示例代码片段:

public class TheaterFragment extends Fragment { 

Typeface face; 
private View view; 
private RelativeLayout rl; 
private LinearLayout linearLayout; 
private int wordLheigh, screenWidht, wordLength, margin, btnHeight; 
private String word; 
private float scale; 
private Animation anim; 
private int tangelSound, whooshSound; 
private SoundPool mSoundPool2; 
private int soundMusic; 
private boolean startAnim = false; 
private LayoutAnimationController controller; 

@Override 
public void onStart(){ 
     super.onStart(); 
    if (!word.equals("suoh") && startAnim) { 

     anim = AnimationUtils.loadAnimation(getActivity(), R.anim.theater); 
     anim.setAnimationListener(new Animation.AnimationListener() { 
      @Override 
      public void onAnimationStart(Animation animation) { 
       mSoundPool2.play(whooshSound, soundMusic, soundMusic, 0, 0, 1); 
       rl.setClickable(false); 

      } 

      @Override 
      public void onAnimationRepeat(Animation animation) { 
      } 

      @Override 
      public void onAnimationEnd(Animation animation) { 
       // linearLayout.startLayoutAnimation(); 
       startAnim = false; 

       Animation anim1 = AnimationUtils.loadAnimation(getActivity(), R.anim.blueword); 
       anim1.setAnimationListener(new Animation.AnimationListener() { 
        @Override 
        public void onAnimationStart(Animation animation) { 
         mSoundPool2.play(tangelSound, soundMusic, soundMusic, 0, wordLength, 0.5f); 

        } 

        @Override 
        public void onAnimationRepeat(Animation animation) { 
        } 

        @Override 
        public void onAnimationEnd(Animation animation) { 
         // rl.setClickable(true); 
        } 
       }); 

       controller = new LayoutAnimationController(anim1, 0.5f); 
       linearLayout.setLayoutAnimation(controller); 
       linearLayout.setLayoutAnimationListener(new Animation.AnimationListener() { 
        public void onAnimationEnd(Animation _animation) { 
         rl.setClickable(true); 

        } 

        public void onAnimationRepeat(Animation _animation) { 
        } 

        public void onAnimationStart(Animation _animation) { 

        } 
       }); 

       linearLayout.setVisibility(View.VISIBLE); 
       linearLayout.startLayoutAnimation(); 
      } 
     }); 

     rl.setVisibility(View.VISIBLE); 
     rl.startAnimation(anim); 

    } 
} 

public void falseClickable(){ 
    rl.setClickable(false); 
    rl.setEnabled(false); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    face = Typefaces.get(getContext(), getContext().getText(R.string.font_droidsans).toString()); 

    if (Build.VERSION.SDK_INT >= 21) 
    { 
     AudioAttributes attributes = new AudioAttributes.Builder() 
       .setUsage(AudioAttributes.USAGE_GAME) 
       .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 
       .build(); 
     mSoundPool2 = new SoundPool.Builder() 
       .setAudioAttributes(attributes) 
       .build(); 
    } else { 
     mSoundPool2 = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); 
    } 

    tangelSound = mSoundPool2.load(getActivity(), R.raw.tangel, 1); 
    whooshSound = mSoundPool2.load(getActivity(), R.raw.whoosh3, 1); 

    scale = getArguments().getInt("scale"); 
    wordLheigh = getArguments().getInt("wordLheigh"); 
    screenWidht = getArguments().getInt("screenWidht"); 
    word = getArguments().getString("word"); 
    wordLength = word.length(); 
    soundMusic = getArguments().getInt("soundMusic"); 
    startAnim = getArguments().getBoolean("startAnim"); 
    //Log.e("TylyTaay", Integer.toString(FINAL)); 
    margin = (int) (getResources().getDimension(R.dimen.word_btn_margin)+0.5f); 
    btnHeight = (int) (screenWidht/10 - 4 * margin +0.5f); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    view = inflater.inflate(R.layout.fragment_theater, container, false); 
    rl = (RelativeLayout) view.findViewById(R.id.theaterLayout); 
    TextView tv1 = (TextView) view.findViewById(R.id.textView1); 
    TextView tv2 = (TextView) view.findViewById(R.id.textView1); 
    tv1.setTypeface(face); 
    tv2.setTypeface(face); 

    if (!word.equals("suoh")){ 
     linearLayout = (LinearLayout) view.findViewById(R.id.clonWordLayout); 
     RelativeLayout.LayoutParams lparams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, wordLheigh); 
     lparams.setMargins(0, screenWidht, 0, 0); 
     linearLayout.setLayoutParams(lparams); 
     setClon(); 
    } else { 
     rl.setVisibility(View.VISIBLE); 
    } 
    return view; 
} 


@Override 
public void onDestroy() { 
    super.onDestroy(); 
    linearLayout.removeAllViews(); 
    linearLayout = null; 

    RefWatcher refWatcher = MyApp.getRefWatcher(getActivity()); 
    refWatcher.watch(this); 
} 

private void setClon() 
{ 
    Button btn; 
    for(int i = 0; i < wordLength; i++) 
    { 
     btn = new Button(getActivity()); 
      char[] ch = {word.charAt(i)}; 
      String st = new String(ch); 
     btn.setText(st); 
     btn.setGravity(Gravity.CENTER); 
     btn.setPadding(0, 0, 0, 0); 
     btn.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.word_btn_text_size)); 
     btn.setBackgroundResource(R.drawable.btn_word_win); 
     btn.setTextColor(getResources().getColorStateList(R.color.dark_gray)); 
     btn.setClickable(false); 
     btn.setTypeface(face); 
     LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(btnHeight, btnHeight); 
     lparams.setMargins(margin, 0,margin, 0); 
     linearLayout.addView(btn, lparams); //Добавляем в LinearLayout 

    } 
    btn = null; 
} 

public void playSound(int nameSound) { 
    if (soundMusic == 1) 
     mSoundPool2.play(nameSound,1,1,0,0,1);} 

T

private void rightAnswer() 
{ 
    if (imgZoom != null) { 
     imgZoomBack(wordL); 
    } 
    wordL.blockWord(false); 
    buttonL.blockBtn(false); 
    gridView.setOnItemClickListener(null); 

    //tf = new TheaterFragment(scale, wordLheigh, screenWidht, word, bar.tvDiamond, bar.tvLevel, bar.imageView, wordId); 
    if (tf == null) { 
     tf = new TheaterFragment(); 
    } 

    if (args == null) { 
     args = new Bundle(); 
    } 
    args.putFloat("scale", scale); 
    args.putInt("wordLheigh", wordLheight); 
    args.putInt("screenWidht", screenWidht); 
    args.putInt("soundMusic", soundOnOff); 
    args.putBoolean("startAnim", true); 
    args.putString("word", word); 

    //Log.e("TylyTaay", Integer.toString(wordId)); 
    args.putInt("wordId", wordId); 

    tf.setArguments(args); 
    args = null; 

    getSupportFragmentManager() 
      .beginTransaction() 
      .add(R.id.frameLayout, tf) 
      .commit(); 

    YoYo.with(Techniques.SlideOutDown) 
      .playOn(bar.tgDiamond); 
    YoYo.with(Techniques.SlideOutDown) 
      .playOn(bar.tgVolume); 
    YoYo.with(Techniques.SlideOutDown) 
      .playOn(bar.tvDiamond); 
    YoYo.with(Techniques.SlideOutDown) 
      .playOn(bar.tvLevel); 
    bar.imageView.setVisibility(View.VISIBLE); 
    YoYo.with(Techniques.SlideInDown) 
      .playOn(bar.imageView);} 

回答

0

我刚才注意到,我采取相同的输出在我application.Even虽然我双重检查我的应用程序可能的内存泄漏后,我解决实际:他在MainActivity,其中所说的片段示例代码点在我的代码里发生内存泄漏,我仍然得到这个消息...你不必担心它,可能它是一个由LeakCanary库创建的错误...只是忽略它,因为我..

相关问题