我正在viewpager中展示150+个图片,但当页面数量超过70时,应用程序会崩溃。所有图片都是从网络加载的,我遵循了[链接]:在将图像加载到位图对象时出现奇怪的内存不足问题
每当页面滑动达到4时,我就将其回收利用。
对于70个页面,该应用程序占用了200 MB的内存。
我需要你的帮助,如何处理它
我必须展示所有页面并能够滑动...
我还使用了Runtime.getRuntime().gc();
如果应用程序内存达到50+ MB,是否有释放内存的方法
提前感谢
我正在viewpager中展示150+个图片,但当页面数量超过70时,应用程序会崩溃。所有图片都是从网络加载的,我遵循了[链接]:在将图像加载到位图对象时出现奇怪的内存不足问题
每当页面滑动达到4时,我就将其回收利用。
对于70个页面,该应用程序占用了200 MB的内存。
我需要你的帮助,如何处理它
我必须展示所有页面并能够滑动...
我还使用了Runtime.getRuntime().gc();
如果应用程序内存达到50+ MB,是否有释放内存的方法
提前感谢
完整的解决方案如下所示,重要的行是在destroyItem方法中:
private class ContentPagerAdapter extends PagerAdapter {
@Override
public void destroyItem(View collection, int position, Object o) {
View view = (View)o;
((ViewPager) collection).removeView(view);
view = null;
}
@Override
public void finishUpdate(View arg0) {
// TODO Auto-generated method stub
}
@Override
public int getCount() {
return ids.length;
}
@Override
public Object instantiateItem(View context, int position) {
ImageView imageView = new ImageView(getApplicationContext());
imageView.findViewById(R.id.item_image);
imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), ids[position]));
((ViewPager) context).addView(imageView);
return imageView;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==((ImageView)object);
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
// TODO Auto-generated method stub
}
@Override
public Parcelable saveState() {
// TODO Auto-generated method stub
return null;
}
@Override
public void startUpdate(View arg0) {
// TODO Auto-generated method stub
}
Sheetal,
看了你的代码后,你能试一下以下操作吗:
@Override
public void destroyItem(View collection, int position, Object o) {
Log.d("DESTROY", "destroying view at position " + position);
View view = (View) o;
((ViewPager) collection).removeView(view);
view = null;
}
这将释放 imageView 以进行垃圾回收。
Sheetal,
我现在没有我的代码,但它应该类似于以下内容:
public class MyFragment extends Fragment {
private Resources resources; // I load my images from different resources installed on the device
private int id;
public MyFragment() {
setRetainInstance(true); // this will prevent the app from crashing on screen rotation
}
public MyFragment(Resources resources, int id) {
this(); // this makes sure that setRetainInstance(true) is always called
this.resources = resources;
this.id = id;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ImageView imageView = (ImageView)inflater.infale(R.layout.fragmentview, container, false);
imageView.setImageBitmap(BitmapFactory.decodeResource(resources, id));
return imageView;
}
}
这基本上是我脑海中的想法,所以可能不是很准确,但它非常接近。
如果你需要更多帮助,就大声喊出来,别忘了将这个答案标记为已经帮助了你:)。
Sheetal,
根据您的要求,我将上述代码用于以下方面:
在我的FragmentActivity中,我在onCreate()方法中执行以下操作:
pager = (ViewPager)findViewById(R.id.pager);
imageAdapter = new MyPagerAdapter(this, pager, theResources, listOfIds.pageBitMapIds);
imageAdapter.setRecentListener(this);
pager.setAdapter(imageAdapter);
然后在我的PagerAdapter中,我执行以下操作:
@Override
public Object instantiateItem(ViewGroup container, int position) {
MyFragment myFragment = new MyFragment(resources, resourceIds[position], recentListener, position);
myFragments[position] = myFragment;
return super.instantiateItem(container, position);
}
@Override
public Fragment getItem(int position) {
return myFragments[position];
}
然后我使用我在上面的先前答案中的代码。
这显然不是完整的代码,而是从我的实际代码进行了适应,但它应该让您了解该做什么以及在哪里做。
马克