内存泄漏与视图寻呼机和片段

时间:2013-10-12 19:27:49

标签: memory-management memory-leaks android-fragments android-viewpager custom-adapter

在我的应用程序的这一部分中,片段中有一个ViewPager内容, 当我替换片段包含viewpager时,android不会清除内存。

如何清除内存?

这是listview的适配器:

        public class LineeAdapter extends  ArrayAdapter<Linea> {
private final List<Linea> list;
    private final Activity context;
    private final int layout;
    public LineeAdapter(Activity context,int layout, List<Linea> list) {
        super(context, layout, list);
        this.context = context;
        this.list = list;
        this.layout=layout;
    }

    static class ViewHolder {
        protected TextView text;
        protected TextView text1;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(layout, null);
            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.text = (TextView) view.findViewById(R.id.cod_linea);
            viewHolder.text1 = (TextView) view.findViewById(R.id.descrizione_linea);

            view.setTag(viewHolder);
        } else {
            view = convertView;
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text.setText(list.get(position).getCod_Linea());
        holder.text1.setText(list.get(position).getDesc_Linea());
        return view;
    }

这是视图分页器中的fragmet包含

public class TempiAtt_Linee extends Fragment
{
View view;
ListView lw;
int dati;
LineeAdapter adapter;
List<Linea> linee ;

static TempiAtt_Linee newInstance(int num)
{
    TempiAtt_Linee f = new TempiAtt_Linee();

    return f;
}

@Override
public void onDestroyView()
{
    super.onDestroyView();
    getView().destroyDrawingCache();
    linee.clear();
    adapter.notifyDataSetChanged();
    adapter.clear();

    view = null;
    lw = null;
    linee = null;
     System.gc();
}

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    linee= new ArrayList<Linea>();

    for (int i = 0; i < Main.GeneralObject.getLinee().size(); i++)
    {
        this.linee.add(Main.GeneralObject.getLinee().get(i));
    }

    lw = (ListView) getView().findViewById(R.id.list_view);
    adapter = new LineeAdapter(getActivity(), R.layout.row_linea, linee);
    lw.setAdapter(adapter);
    lw.setOnItemClickListener(new OnItemClickListener()
    {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1,
                int position, long arg3)
        {
            ArrayList<Percorso> tratte = linee.get(position).getPercorsi();
            Fragment fragment = new TempiAtt_Percorsi();
            FragmentManager fragmentManager = getActivity()
                    .getSupportFragmentManager();
            Bundle temp = new Bundle();
            temp.putString("linea", linee.get(position).getCod_Linea()
                    .replace(" ", "_"));
            temp.putSerializable("tratte",
                    SerializerClass.serializeObject(tratte));
            fragment.setArguments(temp);
            fragmentManager.beginTransaction().addToBackStack(null)
                    .replace(R.id.content_frame, fragment).commit();
        }

    });
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{
    view = inflater.inflate(R.layout.generic_listview, container, false);
    return view;
}

}

这是viewpager的片段:

public class TempiAtt extends Fragment {
// list contains fragments to instantiate in the viewpager
List<Fragment> fragments = null;
int NUM = 3;
List<String> fragmentTitles = null;
// page adapter between fragment list and view pager
private MyAdapter mPagerAdapter = null;
// view pager
private ViewPager mViewPager;
private Handler handler;
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.main_prova, container, false);

    return view;
}
public void clear() {

    if (null != mViewPager) {

        mViewPager.removeAllViews();
    }
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mViewPager = (ViewPager) getView().findViewById(R.id.pager);
    fragments = new Vector<Fragment>();
    setRetainInstance(true);
    fragmentTitles = new Vector<String>();
    Bundle scheda = new Bundle();
    scheda.putInt("scheda", 0);
    // creating fragments and adding to list
    fragments.add(Fragment.instantiate(getActivity(),
            TempiAtt_Linee.class.getName(), scheda));
    fragmentTitles.add(getActivity().getResources().getString(
            R.string.urbana_como));
    Bundle scheda1 = new Bundle();
    scheda1.putInt("scheda", 1);
    fragments.add(Fragment.instantiate(getActivity(),
            TempiAtt_Linee.class.getName(), scheda1));
    fragmentTitles.add(getActivity().getResources().getString(
            R.string.extraurbana));
    Bundle scheda2 = new Bundle();
    scheda2.putInt("scheda", 2);
    fragments.add(Fragment.instantiate(getActivity(),
            TempiAtt_Linee.class.getName(), scheda2));
    fragmentTitles.add(getActivity().getResources().getString(
            R.string.urbana_cantu));
    View pagerStrip = super.getView().findViewById(R.id.pagerTabStrip);
    if (pagerStrip instanceof PagerTabStrip) {
        PagerTabStrip pagerTabStrip = (PagerTabStrip) pagerStrip;
        pagerTabStrip.setDrawFullUnderline(true);
        pagerTabStrip.setTabIndicatorColorResource(R.color.bianco);

    } else if (pagerStrip instanceof PagerTitleStrip) {
        PagerTitleStrip pagerTitleStrip = (PagerTitleStrip) pagerStrip;
        pagerTitleStrip.setTextColor(getResources().getColor(
                android.R.color.white));
    }
    /*
     * this.mPagerAdapter = new PagerAdapter(getChildFragmentManager(),
     * fragments, fragmentTitles);
     * mViewPager.setAdapter(this.mPagerAdapter);
     * mViewPager.setCurrentItem(0);
     */
    mPagerAdapter = new MyAdapter(getChildFragmentManager());
    handler = new Handler();
    handler.post(new Runnable() {

        @Override
        public void run() {
            mViewPager.setAdapter(mPagerAdapter);

        }
    });
    mViewPager.setOffscreenPageLimit(2);

}
@Override
public void onDestroyView() {
    super.onDestroyView();
    onDestroy();
    deleteCard();
    clear();
    view = null;
    System.gc();
}

public void deleteCard() {

    // Reduce the card counter by one
    NUM -= 3;

    for (int i = 0; i < fragments.size(); i++) {

        fragments.remove(i);
        Log.e("SONO IO", fragments.size() + "");

    }

    mPagerAdapter.notifyDataSetChanged();

}
private class MyAdapter extends FragmentPagerAdapter {
    private SparseArray<WeakReference<TempiAtt_Linee>> mPageReferenceMap = new     SparseArray<WeakReference<TempiAtt_Linee>>();;
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }
    @Override
    public Fragment getItem(int index) {

        return getFragment(index);
    }

    @Override
    public int getCount() {

        return NUM;
    }

    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
    public TempiAtt_Linee getFragment(int key) {

        WeakReference<TempiAtt_Linee> weakReference = mPageReferenceMap
                .get(key);

        if (null != weakReference) {

            return (TempiAtt_Linee) weakReference.get();
        } else {

            return null;
        }
    }

    public Object instantiateItem(ViewGroup container, int position) {

        TempiAtt_Linee tempiAttLinee = TempiAtt_Linee.newInstance(position);
        mPageReferenceMap.put(Integer.valueOf(position),
                new WeakReference<TempiAtt_Linee>(tempiAttLinee));

        return super.instantiateItem(container, position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {

        super.destroyItem(container, position, object);
        mPageReferenceMap.remove(Integer.valueOf(position));
    }

}

}

0 个答案:

没有答案