Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试代码的内存泄漏?_Java_Android_Memory Leaks_Garbage Collection - Fatal编程技术网

Java 如何测试代码的内存泄漏?

Java 如何测试代码的内存泄漏?,java,android,memory-leaks,garbage-collection,Java,Android,Memory Leaks,Garbage Collection,帮助了解是否存在内存泄漏。 片段 } 适配器 公共类HowToAdapter扩展BaseAdapter{ 公共静态最终字符串标记=“HowToAdapter”; 私有列表mContentList=null; 私有上下文mContext=null; 私有ImageLoader mImageLoader=null; 私有OnNewsFeedsContentClickListener mOnNewsFeedsContentClickListener=null; 公共HowToAdapter(上下

帮助了解是否存在内存泄漏。
片段

}
适配器

公共类HowToAdapter扩展BaseAdapter{
公共静态最终字符串标记=“HowToAdapter”;
私有列表mContentList=null;
私有上下文mContext=null;
私有ImageLoader mImageLoader=null;
私有OnNewsFeedsContentClickListener mOnNewsFeedsContentClickListener=null;
公共HowToAdapter(上下文上下文、列表上下文列表、OnNewsFeedsContentClickListener OnNewsFeedsContentClickListener)
{
mContext=上下文;
mContentList=contentlist;
mImageLoader=新的ImageLoader(mContext,ImageType.HOW_TO);
mOnNewsFeedsContentClickListener=onNewsFeedsContentClickListener;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
HowToView=null;
if(convertView==null)
{
视图=新的HowToView(mContext);
}
其他的
{
视图=(HowToView)convertView;
}
ContentSkill content=getItem(position);
如果(内容!=null)
{
ViewHolder=(ViewHolder)view.getTag();
最后一个字符串url=Utils.getYouTubeUrlImageFromUrl(content.getUrl());
最后一个字符串youtubeId=Utils.getYoutubeIdFromUrl(content.getUrl());
显示图像(url,holder.pivtumb);
holder.pivtumb.setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
mOnNewsFeedsContentClickListener.onClick(youtubeId,ContentType.VIDEO);
}
});
}
返回视图;
}
}
问题

  • 始终会创建适配器变量最终字符串youtubeId, 但是没有被杀?也就是说,每次创建getView()时 旧的youtubeId记忆不清楚
  • 每次调用getView()OnClickListener时,也将创建 将从内存中清除吗

  • 我认为每次都会重新创建变量,并使用旧内存。

    在这两种情况下,当没有活动的踏板可以访问变量时,它们的资源可以再次回收和重用。我认为这两个答案都是
    是的
    。是的,我说过最好声明一个ViewHolder类的变量,并将其传输到onclillistener。但问题是上述代码中是否存在内存泄漏。
    public class NewsFragment extends Fragment {
    //some code
    private OnNewsFeedsContentClickListener onNewsFeedsContentClickListener = new OnNewsFeedsContentClickListener()
    {
        @Override
        public void onClick(String sYoutubeId, ContentType type)
        {
            //some code
        }
    }
    
    public class HowToAdapter extends BaseAdapter {
    
    public static final String TAG = "HowToAdapter";
    private List<ContentSkill> mContentList = null;
    private Context mContext = null;
    private ImageLoader mImageLoader = null;
    private OnNewsFeedsContentClickListener mOnNewsFeedsContentClickListener = null;
    
    public HowToAdapter(Context context, List<ContentSkill> contetnList, OnNewsFeedsContentClickListener onNewsFeedsContentClickListener)
    {
        mContext = context;
        mContentList = contetnList;
        mImageLoader = new ImageLoader(mContext, ImageType.HOW_TO);
        mOnNewsFeedsContentClickListener = onNewsFeedsContentClickListener;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        HowToView view = null;
        if (convertView == null)
        {
            view = new HowToView(mContext);
        }
        else
        {
            view = (HowToView) convertView;
        }
        ContentSkill content = getItem(position);
        if (content != null)
        {
            ViewHolder holder = (ViewHolder) view.getTag();
            final String url = Utils.getYouTubeUrlImageFromUrl(content.getUrl());
            final String youtubeId = Utils.getYoutubeIdFromUrl(content.getUrl());
            mImageLoader.displayImage(url, holder.pIvThumb);
            holder.pIvThumb.setOnClickListener(new OnClickListener()
            {
    
                @Override
                public void onClick(View v)
                {
                    mOnNewsFeedsContentClickListener.onClick(youtubeId, ContentType.VIDEO);
                }
            });
        }
        return view;
    }