11

я показываю 150+ изображения в ViewPager, когда размер страницы пересекла 70 Приложение грохотом, все изображения загружаются из сети, и я под паром [ссылка]: Strange out of memory issue while loading an image to a Bitmap objectOutofmemeoryerror (ViewPager + imageviews)

и я am утилизация его всякий раз, когда страница swiping достигает 4,

для 70 страниц приложение занимает 200 МБ памяти. .

мне нужна помощь от вас, как справиться с этим

я должен показать все страницы с ударяя ...

я также использовал Runtime.getRuntime() дс();

ли способ высвобождения памяти, если приложение памяти достигает 50+ MB

заранее спасибо

+0

Вы хранения растровых изображений с загрузкой из сети в памяти приложения или в SDCard? – user936414

+0

спасибо за быстрый повтор, я храню растровые изображения в sdcard: Файл sdDir = android.os.Environment.getExternalStorageDirectory(); \t \t \t cacheDir = новый файл (sdDir, context.getString (R.string.cache_dir)); –

+0

Сколько изображений вы показываете на странице? Только одно изображение на просмотр? – user936414

ответ

18

Комплексное решение можно найти ниже, важные линии являются те, в методе 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 

    } 
+0

, получив ClassCastException при использовании View view = (View) o; –

0

Вы загрузки изображений в) метод onCreateView (вид?

Основы, похоже, заботятся о требованиях к управлению памятью при выполнении этого способа. Я попытался загрузить мои изображения в свой FragmentPageAdapter, передав их в мой конструктор фрагментов, предварительно загруженный или как часть метода instaniateItem Fragment, но оба они дали мне проблему, с которой вы столкнулись. В конце я передал информацию, необходимую для загрузки каждого изображения в конструктор фрагмента, а затем использовал эти данные в методе onCreateView().

Марк

+0

нет, я не загружаю изображения в метод просмотра onCreateView(). все изображения загружаются в instantiateItem PagerAdapter –

+0

- это любой способ освободить (освободить) память приложения? какие изображения используют –

+0

. Я думаю, что способ, которым ваше приложение в настоящее время структурируется, будет содержать ссылку на все изображения, поэтому в какой-то момент у вас будет нехватка памяти, особенно на небольших устройствах. Вам нужно переместить создание ваших изображений в метод onCreateView, таким образом, структура будет удерживаться только на трех ссылках на изображение, то есть на предыдущем изображении, отображаемом в данный момент изображении и следующем изображении в последовательности. Эти образы заменяются на следующий салфетки, причем одно из изображений падает со списка трех, а другое добавляется на свое место. – Mark

0

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; 
    } 
} 

Это в значительной степени от верхней части головы, так что это может быть не совсем точно, но это довольно близко.

Если вам нужна дополнительная помощь, просто кричите, не забудьте отметить этот ответ, поскольку помогли вам :).

+1

спасибо, давая образец кода, мне нужна дополнительная помощь от вас, как я могу использовать с ним просмотр пейджера, можете ли вы предоставить полный образец кода viewpager и фрагмент –

+0

Никогда не используйте параметризованный конструктор в классе фрагментов –

4

Я думаю, что это происходит потому, что у вас есть утечка памяти, дважды проверьте свои переменные, не используйте статические vars для чего-либо большого, используйте final, когда это возможно, сделайте всех членов закрытыми.

Я предлагаю вам совершить фиксацию (или сохранить текущий код), а затем попытаться сделать то, что я спросил, и посмотреть, исправляет ли он это.

пример кода позволил бы мне сказать вам, если у вас есть утечки памяти, может быть, вы можете разместить код где-нибудь на GitHub или Google Code

Итог: вы могли бы делать все правильно, но переменная по-прежнему держит ссылку на ваши изображения, чтобы сборщик мусора не мог их трогать.

Я знаю, что у вас болит утечка памяти, но, пожалуйста, не беспокойтесь, это случается с лучшими из лучших, потому что это так просто.

ПРИМЕЧАНИЕ. Независимо от того, насколько велики данные, загружаемые из сетевых приложений, не требуется больше, чем размер 1 файла при правильной обработке.

Благодаря

+0

как я могу проверить утечку памяти, необходимую переменную public rest is private –

0

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]; 
} 

И затем я использую код в своем предыдущем ответе выше.

Это, очевидно, не полный код, и он был адаптирован из моего фактического кода, но он должен дать вам хорошее представление о том, что делать и где это делать.

Марк

+0

Mark, что instantiateItem возвращается, я получаю ошибку в этом утверждении: return super.instantiateItem (контейнер, позиция); // говорит: Не удается напрямую вызвать абстрактный метод instantiateItem (View, int) для типа PagerAdapter –

+0

Лист, вы можете написать мне свой код? – Mark

+0

уверен, что вы можете дать свой идентификатор электронной почты, чтобы я мог почтовый код –

1

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 для сбора мусора.

 Смежные вопросы

  • Нет связанных вопросов^_^