2016-04-04 11 views
0

Hilfe finden Sie Speicherlecks in meiner App.Wie finden Sie Speicherlecks mit LeakCanary in der Android App?

LeakCanary:

-static android.app.ActivityThread.sCurrentActivityThread

-Referenzen android.utill.ArrayMap.mArray

-Referenz Array java.lang.Object []. 1

-Referenzen android.app.ActivityThread $ ActivityClientRecord.activity

-Referenzen MainActivity.tf (tf - mein Fragment)

-leaks TheaterFragment Instanz

Beispiel Codefragment:

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 probieren er Code in MainActivity, die das Fragment nennen:

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

Antwort

0

ich gerade bemerkt haben, dass ich die gleiche Leistung in meinem application.Even nehmen, obwohl ich meine App verdoppeln auf mögliche Speicherlecks überprüft und nachdem ich lösen die tatsächlichen Zeigen Sie in meinem Code, wo Speicherleck aufgetreten ist, bekomme ich immer noch diese Nachricht ... Sie müssen sich keine Sorgen machen, wahrscheinlich ist es ein Fehler von LeakCanary-Bibliothek erstellt ... einfach ignorieren, wie ich es tat ..