Handlers and memory leaks in Android

前端 未结 6 2129
攒了一身酷
攒了一身酷 2020-11-29 18:14

Please have a look at the code below:

public class MyGridFragment extends Fragment{

     Handler myhandler = new Handler() {
    @Override
    public void h         


        
6条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-29 18:53

    Here's a somewhat useful little class I made that you can use. Sadly it's still quite verbose because you can't have anonymous static inner classes.

    import java.lang.ref.WeakReference;
    import android.os.Handler;
    import android.os.Message;
    
    /** A handler which keeps a weak reference to a fragment. According to
     * Android's lint, references to Handlers can be kept around for a long
     * time - longer than Fragments for example. So we should use handlers
     * that don't have strong references to the things they are handling for.
     * 
     * You can use this class to more or less forget about that requirement.
     * Unfortunately you can have anonymous static inner classes, so it is a
     * little more verbose.
     * 
     * Example use:
     * 
     *  private static class MsgHandler extends WeakReferenceHandler
     *  {
     *      public MsgHandler(MyFragment fragment) { super(fragment); }
     * 
     *      @Override
     *      public void handleMessage(MyFragment fragment, Message msg)
     *      {
     *          fragment.doStuff(msg.arg1);
     *      }
     *  }
     * 
     *  // ...
     *  MsgHandler handler = new MsgHandler(this);
     */
    public abstract class WeakReferenceHandler extends Handler
    {
        private WeakReference mReference;
    
        public WeakReferenceHandler(T reference)
        {
            mReference = new WeakReference(reference);
        }
    
        @Override
        public void handleMessage(Message msg)
        {
            if (mReference.get() == null)
                return;
            handleMessage(mReference.get(), msg);
        }
    
        protected abstract void handleMessage(T reference, Message msg);
    }
    

提交回复
热议问题