2012-06-12 24 views
7

Ok, penso di avere una vera domanda per cambiare. Ho implementato una gridView in Android, seguendo passo passo le istruzioni nella pagina degli sviluppatori Android, http://developer.android.com/resources/tutorials/views/hello-gridview.html L'ho modificata in modo che quando si fa clic su una vista, la bitmap venga restituita. Tutto questo funziona alla grande su telefoni avanzati come Galxy Note e Galaxy S2, e su quelli meno avanzati come Galaxy asso e persino qualche schifoso htc di 2 anni fa. Ma per qualche ragione, si blocca su Galaxy 3 con ICS a causa di problemi di OutOfMemory. Quando si utilizza circa la metà delle immagini sul gridview, funziona (anche se un po 'lentamente). Ha senso per qualcuno?android gridview si blocca su Galaxy 3

Questa è la mia implementazione di ImageAdapter:

public class ImageAdapter extends BaseAdapter { 
private Context mContext; 
private int mWidth; 
private int mHeight; 

public ImageAdapter(Context c, int width, int height) { 
    mContext = c; 
    mWidth = width; 
    mHeight = height; 
} 

public int getCount() { 
    return mThumbIds.length; 
} 

public Object getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return mThumbIds[position]; 
} 

// create a new ImageView for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(mWidth, mHeight)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 

// references to our images 
private Integer[] mThumbIds = { 
     R.drawable.third_world , R.drawable.annoyinggirl, 
     R.drawable.asianfather, R.drawable.awkawespeng, 
     R.drawable.awkpeng, R.drawable.blankdad, 
     R.drawable.collegesenior, R.drawable.courage, 
     R.drawable.frog, R.drawable.frynotsure, 
     R.drawable.goodguygreg, R.drawable.scumbag, 
     R.drawable.raptor,R.drawable.keano, 
     R.drawable.successkid, R.drawable.wonka, 
     R.drawable.braceyourselves, R.drawable.onedoesnotsimply, 
     R.drawable.firstworldproblem, R.drawable.amitheonlyone, 
     R.drawable.badluckbrian, R.drawable.interestingman, 
     R.drawable.toodamnhigh, R.drawable.def  
}; 

}

Questa è la funzione di chiamata dal mio principale:

private void changeToTemplateView(){ 
    setContentView(R.layout.templates); 

    GridView gridview = (GridView) findViewById(R.id.gridview); 
    gridview.setAdapter(new ImageAdapter(context, (int)(dstWidth * 1.4), (int)(dstHeight * 1.4))); 

    gridview.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 

      Options opts = new Options(); 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), (int) parent.getItemIdAtPosition(position), opts); 

      //do stuff with bitmap   
     } 
    }); 
} 

e questo è il XML per il GridView:

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/gridview" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:columnWidth="90dp" 
android:numColumns="auto_fit" 
android:verticalSpacing="10dp" 
android:horizontalSpacing="10dp" 
android:stretchMode="columnWidth" 
android:gravity="center" 

/>

Se qualcuno ha qualche idea di quello che potrebbe essere sbagliato qui, sarò sempre grato

EDIT: Prima dell'incidente, ottengo un errore nel registro: "FimgApiStretch: Stretch non riuscita". Inoltre, lo scorrimento nella griglia non funziona. Questo è indipendentemente dal fatto che anche se non ci sono abbastanza miniature per causare una pergamena, l'app andrà ancora in crash

+0

puoi fornire i messaggi logcat? –

+0

@Muhannad solo domani, non possiedo un Galaxy S3 e non ne avrò accesso oggi. Sarà di aiuto se mostrerò la griglia attuale? –

risposta

2

prova a sostituire fill_parent con match_parent perché secondo le mie informazioni il valore dell'attributo fill_parent è deprecato su Android 2.2 e sopra speranza questo aiuterebbe

si può vedere questo link http://developer.android.com/training/displaying-bitmaps/load-bitmap.html Spero che questo vi aiuterà a

+0

non funziona :(si blocca ancora .. –

+0

Ho affrontato un broblem in Galaxy S3 Penso che sia lo stesso, ed è correlato alla decodifica bitmap, causerà OutOfMemoryError, quindi se è possibile fornire le informazioni di errore logcat al più presto –

+0

questo è preso da Google Play ed è un problema che appare per molti altri utenti, presumo sia lo stesso del problema del Galaxy 3 java.lang.OutOfMemoryError: la dimensione della bitmap supera il budget della VM su android.graphics.BitmapFactory.nativeDecodeAsset (Metodo nativo) su android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:494) su android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:370) su android.graphics.drawable.Drawable.createFromResourceStream (Drawable.java : 715) su android.content .res.Resources.loadDrawable (Resources.java:1720) –

2

quanto riguarda la questione "perché il diavolo è che si infrangono su Galaxy 3 e non sui telefoni inferiori", la risposta è "Non ho idea". Ma, risulta che ho abusato del gridview. È una cattiva idea usare la stessa immagine sia per la miniatura che per l'intera immagine. Quello che ho fatto (che potrebbe essere nient'altro che una soluzione alternativa, ma funziona) consiste nell'utilizzare 2 set di immagini, una piccola e una ines intera. Questo viene fatto in questo modo

Per impostare le anteprime:

private Integer[] mThumbIds = { 
     R.drawable.third_world__small , R.drawable.annoyinggirl__small, 
     R.drawable.asianfather__small, R.drawable.awkawespeng__small, 
     R.drawable.awkpeng__small, R.drawable.blankdad__small, 
     R.drawable.collegesenior__small, R.drawable.courage__small, 
     R.drawable.frog__small, R.drawable.frynotsure__small, 
     R.drawable.goodguygreg__small, R.drawable.scumbag__small, 
     R.drawable.raptor__small,R.drawable.keano__small, 
     R.drawable.successkid__small, R.drawable.wonka__small, 
     R.drawable.braceyourselves__small, R.drawable.onedoesnotsimply__small, 
     R.drawable.firstworldproblem__small, R.drawable.amitheonlyone__small, 
     R.drawable.badluckbrian__small, R.drawable.interestingman__small, 
     R.drawable.toodamnhigh__small, R.drawable.def__small  
}; 

public View getView(int position, View convertView, ViewGroup parent) { 
    //clearAllResources(); 
    ImageView imageView; 
    if (convertView == null) { // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(mWidth, mHeight)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 

Poi, creare un altro array:

private Map<Integer, Integer> mThumbIdToFullSizeId = new HashMap<Integer,Integer>(); 
public ImageAdapter(Context c, int width, int height) { 
    mContext = c; 
    mWidth = width; 
    mHeight = height; 
    mThumbIdToFullSizeId.put(R.drawable.third_world__small, R.drawable.third_world); 
    mThumbIdToFullSizeId.put(R.drawable.annoyinggirl__small,R.drawable.annoyinggirl); 
    mThumbIdToFullSizeId.put(R.drawable.asianfather__small, R.drawable.asianfather); 
    mThumbIdToFullSizeId.put(R.drawable.awkawespeng__small, R.drawable.awkawespeng); 
    mThumbIdToFullSizeId.put(R.drawable.awkpeng__small, R.drawable.awkpeng); 
    mThumbIdToFullSizeId.put(R.drawable.blankdad__small, R.drawable.blankdad); 
    mThumbIdToFullSizeId.put(R.drawable.collegesenior__small, R.drawable.collegesenior); 
    mThumbIdToFullSizeId.put(R.drawable.courage__small, R.drawable.courage); 
    mThumbIdToFullSizeId.put(R.drawable.frog__small, R.drawable.frog); 
    mThumbIdToFullSizeId.put(R.drawable.frynotsure__small, R.drawable.frynotsure); 
    mThumbIdToFullSizeId.put(R.drawable.goodguygreg__small, R.drawable.goodguygreg); 
    mThumbIdToFullSizeId.put(R.drawable.scumbag__small, R.drawable.scumbag); 
    mThumbIdToFullSizeId.put(R.drawable.raptor__small, R.drawable.raptor); 
    mThumbIdToFullSizeId.put(R.drawable.keano__small, R.drawable.keano); 
    mThumbIdToFullSizeId.put(R.drawable.successkid__small, R.drawable.successkid); 
    mThumbIdToFullSizeId.put(R.drawable.wonka__small, R.drawable.wonka); 
    mThumbIdToFullSizeId.put(R.drawable.braceyourselves__small, R.drawable.braceyourselves); 
    mThumbIdToFullSizeId.put(R.drawable.onedoesnotsimply__small, R.drawable.onedoesnotsimply); 
    mThumbIdToFullSizeId.put(R.drawable.firstworldproblem__small, R.drawable.firstworldproblem); 
    mThumbIdToFullSizeId.put(R.drawable.amitheonlyone__small, R.drawable.amitheonlyone); 
    mThumbIdToFullSizeId.put(R.drawable.badluckbrian__small, R.drawable.badluckbrian); 
    mThumbIdToFullSizeId.put(R.drawable.interestingman__small, R.drawable.interestingman); 
    mThumbIdToFullSizeId.put(R.drawable.toodamnhigh__small, R.drawable.toodamnhigh); 
    mThumbIdToFullSizeId.put(R.drawable.def__small, R.drawable.def); 
} 

Poi, per la funzione GetView:

public long getItemId(int position) { 

    return mThumbIdToFullSizeId.get(mThumbIds[position]); 
} 

E tutto sarà molto più memoria amichevole. Sto dando il segno di spunta a Muhannad per avermi dato il link a http://developer.android.com/training/displaying-bitmaps/load-bitmap.html che ha aiutato molto

+1

Molto bene Sono molto contento di averti dato un consiglio ma hai fatto tutto, grazie !!! –

1

Ho avuto un problema simile. La mia app funziona sempre senza problemi, ma ha iniziato a bloccarsi con l'errore OutOfMemory sui dispositivi con Android 4. In particolare, si blocca durante il caricamento dell'adattatore GalleryView. Dopo aver letto molte pagine della documentazione ufficiale (http: // android.developer.com) Ho imparato che la memoria è usata in modo diverso dalla vecchia versione di SO, ma ha definitivamente risolto il problema relativo al file manifest. Ho impostato Android 3.0 come target per la creazione del progetto, aggiunto android: targetSdkVersion = "15", aggiunto android: largeHeap = "true" al tag dell'applicazione e infine aggiunti i support-screens android: anyDensity = "false"

Spero che questo possa aiuta anche te!

+0

Grazie! Come ho scritto qui di seguito, ho già risolto il problema in un modo diverso, ma terrò questo a mente la prossima volta che mi trovo in un tale problema –

+0

Mi chiedo quali sono gli effetti collaterali di tali impostazioni ... Sto affrontando lo stesso problema durante il caricamento di alcuni bitmap, e penso che finirò la creazione di un apk diverso per SGS3 o direttamente impostandolo come un dispositivo non supportato. Preferisco perdere alcune centinaia di utenti che avere centinaia di lamentele riguardo agli arresti anomali. –

+0

BTW, non ho alcun problema con Android 4 stesso, ho persino un Nexus7 con JB e un SGS2 con dispositivi effettivi ICS, e il mio gioco funziona semplicemente PERFETTO su quelli. Quindi il mio problema è esclusivamente con SGS3. –