Вопрос по android, gridview, galaxy – Android GridView вылетает на Galaxy 3

7

Хорошо, я думаю, у меня есть реальный вопрос для разнообразия. Я реализовал gridView в Android, следуя пошаговым инструкциям на странице разработчиков Android,http://developer.android.com/resources/tutorials/views/hello-gridview.html Я изменил его так, чтобы при нажатии на представление, растровое изображение было возвращено. Все это прекрасно работает на продвинутых телефонах, таких как Galxy Note и Galaxy S2, и на менее продвинутых телефонах, таких как Galaxy ace и даже какой-то дурацкий HTC 2 года назад. Но по какой-то причине он падает на galaxy 3 с ICS из-за проблем OutOfMemory. При использовании около половины изображений в виде сетки это работает (хотя и немного медленно). Имеет ли это какой-либо смысл для кого-либо?

Это моя реализация 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    
};

}

Это вызывающая функция из моего основного:

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

И это XML для 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"

/ & GT;

Если кто-нибудь знает, что я могу здесь делать не так, я буду всегда благодарен

РЕДАКТИРОВАТЬ: до сбоя, я получаю сообщение об ошибке в журнале: "FimgApiStretch: растяжение не удалось". Кроме того, прокрутка в виде сетки не работает. Это происходит независимо от того, что даже если эскизов недостаточно для прокрутки, приложение все равно будет аварийно завершать работу.

Вы можете предоставить сообщения logcat? Muhannad A.Alhariri
@ Муханнад, только завтра, у меня нет Galaxy S3, и у меня не будет доступа к нему сегодня. Будет ли какая-то помощь, если я покажу реальный вид сетки? n00b programmer

Ваш Ответ

3   ответа
2

Что касается вопроса «почему, черт возьми, он рушится на galaxy 3, а не на младших телефонах», ответ «я понятия не имею». Но, оказывается, я неправильно использовал gridview. Это плохая идея использовать одно и то же изображение как для эскиза, так и для всего изображения. Что я сделал (что может быть не более чем обходной путь, но он работает), так это использование 2 наборов изображений, маленького и полного размера. Это сделано так

Для настройки миниатюр:

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

Затем создайте еще один массив:

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

Затем для функции getview:

public long getItemId(int position) {

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

И все будет гораздо более дружественным к памяти. Я ставлю галочку Муханнаду за то, что он дал мне ссылку наhttp://developer.android.com/training/displaying-bitmaps/load-bitmap.html что очень помогло

Очень хорошо, я очень рад, что дал вам совет, но вы сделали все, спасибо !!!
1

У меня была похожая проблема. Мое приложение всегда работает без проблем, но начало сбой сOutOfMemory ошибка на устройствах с Android 4. В частности, происходит сбой при загрузке адаптера GalleryView. Прочитав много страниц официальной документации (http://android.developer.com), я узнал, что память используется не так, как в старой версии SO, но окончательно решил проблему с файлом манифеста. Я установил Android 3.0 в качестве цели Project Build, добавил android: targetSdkVersion = & quot; 15 & quot ;, добавил android: largeHeap = & quot; true & quot; к тегу приложения и наконец добавили опоры-экраны android: anyDensity = & quot; false & quot;

Надеюсь, что это может помочь вам тоже!

Спасибо! Как я уже писал ниже, я уже решил проблему другим способом, но я буду помнить об этом в следующий раз, когда столкнусь с такой проблемой. n00b programmer
Интересно, каковы побочные эффекты таких настроек ... Я сталкиваюсь с той же проблемой при загрузке некоторых растровых изображений, и я думаю, что я закончу создавать другой apk для SGS3 или напрямую установить его как неподдерживаемое устройство. Я предпочитаю потерять несколько сотен пользователей, чем сотни жалоб на сбои.
2

попробуйте заменить fill_parent на match_parent, потому что согласно моей информации значение атрибута fill_parent устарело на Android 2.2 и выше надеюсь, это поможет

Вы можете увидеть эту ссылкуhttp://developer.android.com/training/displaying-bitmaps/load-bitmap.html I hope this will help you

см. ссылку выше и сообщите нам, если вы получаете какую-либо выгоду
Да, это тоже ошибка outOfMemory :) n00b programmer
не работает :( все равно вылетает .. n00b programmer
Я столкнулся с проблемой в Galaxy S3, я думаю, что это то же самое, и это связано с декодированием растровых изображений, это вызовет OutOfMemoryError, поэтому, если вы можете предоставить информацию об ошибке logcat как можно скорее
это взято из Google play и является проблемой, которая появляется для многих других пользователей, я полагаю, что она такая же, как и проблема Galaxy 3. java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины на android.graphics.BitmapFactory. nativeDecodeAsset (собственный метод) в android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:494) в android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:370) в android.graphics.drawable.Drawable.createFromResourceStream ( 715) на android.content.res.Resources.loadDrawable (Resources.java:1720) n00b programmer

Похожие вопросы