我编写了一个Utilloader类,它提供了一个从net加载一些数据的加载器线程。在我的活动中,我开始一个新的加载器线程。然后该线程通过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());
}
});
}
}
}
这种活动更新方式是否会通过保留对活动的引用来导致内存泄漏?如果是,我该怎么改变它,所以没有内存泄漏?
答案 0 :(得分:0)
是的,UtilLoader
包含对您传递为OnLoadListener
的匿名内部类的引用,而这个匿名内部类依次包含对该活动的引用。
答案 1 :(得分:0)
是的,如果你正在设置一个回调,即updateUI(),它肯定会通过保持对它的引用而导致内存泄漏,从而阻止GC收集它。
答案 2 :(得分:0)
这是可能的。只要与处理程序关联的Looper在队列中有消息,它就会保留对相关活动/服务的引用。对于长时间运行的操作,这可能是一个问题。有关更多信息,请参阅此主题:
This Handler class should be static or leaks might occur: IncomingHandler