0

我编写了一个 Utilloader 类,它提供了一个从网络加载一些数据的加载器线程。在我的活动中,我启动了一个新的加载程序线程。然后线程通过 handler.post() 更新活动。

class MyActivity extends Activity
{
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    initUI();
    UtilLoader.getInstance().load("url", new UtilLoad.OnLoadListener
    {
      public void onLoadSuccess(String response)
      {
         updateUI();
      }
    });
  }
}

class UtilLoader
{
  private Handler handler = new Handler();
  private UtilLoader instance = new UtilLoader();
  private ExecutorService executorService = Executors.newFixedThreadPool(3);
  public interface OnLoadListener
  {
    public void onLoadSuccess(String response);
  }
  public UtilLoader getInstance()
  {
    return instance;
  }
  public load(String url, OnLoadListener onLoadListener)
  {
    executorService.submit(new Loader(url, onLoadListener));
  }
  public class Loader extends Runnable
  {
     private String url;
     private OnLoadListener onLoadListener;
     public Loader(String url, OnLoadListener onLoadListener)
     {
        this.url = url;
        this.onLoadListener = onLoadListener;
     }
     public void run()
     {
        // LOAD DATA
        handler.post(new Runnable() {        
           public void run() {
             onLoadListener.onLoadSuccess(sb.toString());
           }
        });
     }
  }
}

这种活动更新方式是否会通过保留对活动的引用而导致内存泄漏?如果是,我必须如何更改它,所以没有内存泄漏?

4

3 回答 3

0

是的,UtilLoader持有对您传入的OnLoadListener匿名内部类的引用,而这个匿名内部类又持有对活动的引用。

于 2013-11-07T09:06:24.803 回答
0

是的,如果您正在设置回调,即 updateUI(),它肯定会通过保留对它的引用而导致内存泄漏,从而阻止 GC 收集它。

于 2013-11-07T09:07:12.640 回答
0

这是可能的。只要与处理程序关联的 Looper 在队列中有消息,它就会保留对关联的 Activity/Service 的引用。对于长时间运行的操作,这可能是一个问题。有关更多信息,请参见此线程:

这个 Handler 类应该是静态的,否则可能会发生泄漏:IncomingHandler

于 2013-11-07T09:08:02.380 回答