Domanda

sto mostrando più di 150 immagini nel viewpager, quando la dimensione della pagina ha superato 70 app si blocca, tutte le immagini vengono caricate dalla rete e ho seguito [link]: Stranoproblema di memoria insufficiente durante il caricamento di un'immagine in un oggetto Bitmap

e lo sto riciclando ogni volta che lo scorrimento della pagina raggiunge 4,

per app di 70 pagine che richiedono 200 MB di memoria.

ho bisogno di aiuto da te, come gestirlo

devo mostrare tutte le pagine con lo scorrimento ...

ho anche usato Runtime.getRuntime (). gc ();

è un modo per liberare memoria se la memoria dell'app raggiunge oltre 50 MB

grazie in anticipo

È stato utile?

Soluzione

La soluzione completa può essere trovata di seguito, le righe importanti sono quelle nel metodo 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

    }

Altri suggerimenti

Penso che ciò accada perché hai una perdita di memoria, ricontrolla le tue variabili, non usare variabili statiche per qualcosa di grande, usa final quando possibile, rendi privati tutti i membri.

ti suggerisco di fare un commit (o salvare il tuo codice corrente) e poi provare a fare quello che ho chiesto e vedere se lo risolve.

un esempio di codice mi permetterebbe di dirti se hai perdite di memoria, forse puoi pubblicare il codice da qualche parte come su GitHub o codice Google

In conclusione: potresti fare tutto bene, ma una variabile mantiene ancora un riferimento alle tue immagini in modo che il garbage collector non possa toccarle.

So che dire che hai una perdita di memoria fa male, ma per favore non allarmarti, questo accade al meglio del meglio, perché è così facile.

NOTA: non importa quanto siano grandi i dati che carico dalle app di rete, non sono mai stati necessari più della dimensione di 1 file se gestiti correttamente.

Grazie

Sheetal,

Dopo aver esaminato il codice, puoi provare quanto segue:

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

Questo dovrebbe rilasciare imageView per la garbage collection.

Stai caricando le tue immagini nel metodo di visualizzazione onCreateView ()?

Il framework sembra prendersi cura dei requisiti di gestione della memoria quando lo fa in questo modo.Avevo provato a caricare le mie immagini nel mio FragmentPageAdapter passandole al mio costruttore di frammenti precaricato o come parte del metodo Fragment instaniateItem, ma entrambi mi hanno dato il problema che stai affrontando.Alla fine ho passato le informazioni necessarie per caricare ogni immagine nel costruttore Fragment e poi ho utilizzato questi dettagli nel metodo onCreateView ().

Segna

Sheetal,

Non ho il mio codice davanti a me in questo momento, ma dovrebbe essere qualcosa di simile al seguente:

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

Questo è praticamente fuori dalla mia testa, quindi potrebbe non essere esatto, ma è abbastanza vicino.

Se hai bisogno di ulteriore aiuto, urla, non dimenticare di contrassegnare questa risposta come se ti avesse aiutato :).

Sheetal,

Come richiesto, utilizzo il codice sopra come segue:

Nel mio FragmentActivity faccio quanto segue nel metodo onCreate ():

pager = (ViewPager)findViewById(R.id.pager);
imageAdapter = new MyPagerAdapter(this, pager, theResources, listOfIds.pageBitMapIds);
imageAdapter.setRecentListener(this);
pager.setAdapter(imageAdapter);

Quindi nel mio PagerAdapter faccio quanto segue:

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

E poi uso il codice nella mia precedente risposta sopra.

Questo ovviamente non è un codice completo ed è stato adattato dal mio codice attuale, ma dovrebbe darti una buona idea di cosa fare e dove farlo.

Segna

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top