2012-06-12 27 views
7

Ok, creo que tengo una pregunta real para variar. Implementé un gridView en Android, siguiendo paso a paso las instrucciones en la página de Desarrolladores de Android, http://developer.android.com/resources/tutorials/views/hello-gridview.html Lo cambié para que al hacer clic en una vista, se devuelva el mapa de bits. Todo esto funciona muy bien en teléfonos avanzados como Galxy Note y Galaxy S2, y en los menos avanzados como Galaxy Ace e incluso algunos hppy cómicos de hace 2 años. Pero por alguna razón, se bloquea en galaxy 3 con ICS debido a problemas de OutOfMemory. Cuando se utiliza aproximadamente la mitad de las imágenes en la vista de cuadrícula, funciona (aunque un poco lentamente). ¿Tiene esto sentido para alguien?android gridview se bloquea en Galaxy 3

Esta es mi implementación de 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  
}; 

}

Ésta es la función de llamada de mi principal:

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

Y este es el XML para el 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" 

/>

Si alguien tiene alguna idea de lo que podría estar haciendo mal aquí, estaré siempre agradecido

EDIT: Antes del accidente, me sale un error en el registro: "FimgApiStretch: no estirar". Además, el desplazamiento en la vista de cuadrícula no funciona. Esto es independientemente del hecho de que incluso si no hay suficientes miniaturas para causar un desplazamiento, la aplicación aún se bloqueará

+0

puede proporcionar los mensajes de logcat? –

+0

@Muhannad solo mañana, no tengo un Galaxy s3 y no tendré acceso a uno hoy. ¿Será de ayuda si muestro la vista de cuadrícula real? –

Respuesta

2

intenta reemplazar fill_parent con match_parent porque según mi información el valor del atributo fill_parent está en desuso en android 2.2 y por encima de esperanza que esto ayudaría a

se puede ver este enlace http://developer.android.com/training/displaying-bitmaps/load-bitmap.html espero que esto le ayudará a

+0

no funciona :(todavía se bloquea .. –

+0

me enfrentaba a un broblem en Galaxy S3, creo que es lo mismo, y que está relacionada con la descodificación de mapas de bits, que hará que OutOfMemoryError, así que si usted puede proporcionar la información de error Logcat lo antes posible –

+0

esto está tomado de Google Play y es un problema que aparece para muchos otros usuarios, supongo que es el mismo que el problema del Galaxy 3 java.lang.OutOfMemoryError: el tamaño del mapa de bits excede el presupuesto de la VM en android.graphics.BitmapFactory.nativeDecodeAsset (Native Method) en android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:494) en android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:370) en android.graphics.drawable.Drawable.createFromResourceStream (Drawable.java : 715) en android.content .res.Resources.loadDrawable (Resources.java:1720) –

2

en cuanto a la pregunta "¿por qué demonios es lo que se estrella en la galaxia 3 y no en los teléfonos inferiores", la respuesta es "No tengo idea". Pero, resulta que he estado haciendo un mal uso de la vista de cuadrícula. No es una buena idea usar la misma imagen para la miniatura y para toda la imagen. Lo que hice (que podría ser nada más que una solución alternativa, pero funciona) es usar 2 juegos de imágenes, una pequeña y una de tamaño completo. Esto se hace de la siguiente

Para el ajuste de las miniaturas:

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

A continuación, crear otra matriz:

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

Entonces, para la función getView:

public long getItemId(int position) { 

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

Y todo será mucho más amigable con la memoria. Estoy dando la marca de verificación a Muhannad por darme el enlace a http://developer.android.com/training/displaying-bitmaps/load-bitmap.html que ayudó mucho

+1

Muy bien Estoy muy contento de que te haya dado un consejo, pero has hecho todo, gracias !!! –

1

Tuve un problema similar. Mi aplicación siempre funciona bien sin ningún problema, pero comenzó a fallar con OutOfMemory error en dispositivos con Android 4. En particular, se bloquea al cargar el adaptador GalleryView. Después de leer muchas páginas de la documentación oficial (http: // android.developer.com) Aprendí que la memoria se usa de forma diferente a la versión anterior de SO, pero resolvió definitivamente el problema al trabajar en el archivo de manifiesto. Me puse Android 3.0 como objetivo generación de proyecto, añadí androide: targetSdkVersion = "15", añadí androide: largeHeap = "true" a la etiqueta de solicitud y por último añadido soporta pantallas de Android: anyDensity = "false"

Esperamos que esto pueda ¡te ayudo también!

+0

¡Gracias! Al igual que escribí a continuación, ya resuelto el problema de una manera diferente, pero voy a tener esto en cuenta la próxima vez que me meto en un problema tan –

+0

Me pregunto cuáles son los efectos colaterales de estos ajustes ... Estoy frente a la misma problema al cargar algunos mapas de bits, y creo que terminaré creando una aplicación diferente para SGS3 o configurándola directamente como un dispositivo no compatible. Prefiero perder algunos cientos de usuarios que tener cientos de quejas sobre bloqueos. –

+0

Por cierto, no tengo ningún problema con Android 4 propiamente dicho, tengo incluso un Nexus7 con JB y un SGS2 con dispositivos reales del ICS, y mi juego simplemente funciona perfecto en aquellos. Entonces mi problema es exclusivamente con el SGS3. –

Cuestiones relacionadas