Ошибка OOM PagerAdapter при использовании ImageView - PullRequest
0 голосов
/ 24 июня 2018

У меня проблемы со скольжением картинок в моей деятельности. Когда я скользю 5-10 раз, я получаю ошибку OutOfMemoryError. В этом нет ничего необычного. Моя проблема связана с использованием BitmapFactory и вычислением размера изображения, как на этой странице: https://android.jlelse.eu/loading-large-bitmaps-efficiently-in-android-66826cd4ad53. Я не знаю, как это работает, когда я использую SlidingAdapter / PagerAdapter, и мои изображения нумеруются.

Это мой код:

public class SliderAdapter extends PagerAdapter {

static Resources res = null;
Context context;
LayoutInflater layoutInflater;



public SliderAdapter(Context context)
{
    this.context = context;
    slide_headings =  context.getResources().getStringArray(R.array.p06_naglowek);
    slide_descs = context.getResources().getStringArray(R.array.p06_opis);
}

public int [] slide_images = {
        R.drawable.komputer_startowe,
        R.drawable.ecu_version,
        R.drawable.potrzebne_elementy,
        R.drawable.co_gdzie,
        R.drawable.rm11,
        R.drawable.p06_finish


};

String[] slide_headings;

String[] slide_descs;

public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

@Override
public int getCount() {
    return slide_headings.length;
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
    return view == (RelativeLayout) object;

}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
    layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.slide_layout, container, false);



    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = false;
    options.inSampleSize = calculateInSampleSize(options, 500,500);

    Bitmap startImage = BitmapFactory.decodeResource(context.getResources(),R.drawable.komputer_startowe,options);


    ImageView slideImageView = (ImageView) view.findViewById(R.id.slide_image);
    TextView slideHeading = (TextView) view.findViewById(R.id.slide_heading);
    TextView slideDescription = (TextView) view.findViewById(R.id.slide_desc);


    slideImageView.setImageResource(slide_images[position]);
    slideHeading.setText(slide_headings[position]);
    slideDescription.setText(slide_descs[position]);

    container.addView(view);

    return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView((RelativeLayout)object);
}
}

1 Ответ

0 голосов
/ 25 июня 2018

Хорошо, у меня есть решение. Может быть, кому-то это пригодится.

Вот активность:

public class SliderAdapter extends PagerAdapter {

static Resources res = null;
Context context;
LayoutInflater layoutInflater;
static Bitmap bitmap;



public SliderAdapter(Context context)
{
    this.context = context;
    slide_headings =  context.getResources().getStringArray(R.array.p06_naglowek);
    slide_descs = context.getResources().getStringArray(R.array.p06_opis);


}

public int [] slide_images = {
        R.drawable.komputer_startowe,
        R.drawable.ecu_version,
        R.drawable.potrzebne_elementy,
        R.drawable.co_gdzie,
        R.drawable.rm11,
        R.drawable.p06_finish
};

String[] slide_headings;

String[] slide_descs;


@Override
public int getCount() {
    return slide_headings.length;
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
    return view == (RelativeLayout) object;

}

@NonNull

    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inSampleSize = 1;
//        o.inDither = false;
    o.inScaled = true;
    o.inDensity = srcWidth;
    o.inTargetDensity = dstWidth*o.inSampleSize;
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), slide_images[position], o);



    ImageView slideImageView = (ImageView) view.findViewById(R.id.slide_image);
    TextView slideHeading = (TextView) view.findViewById(R.id.slide_heading);
    TextView slideDescription = (TextView) view.findViewById(R.id.slide_desc);


    slideImageView.setImageResource(slide_images[position]);
    slideHeading.setText(slide_headings[position]);
    slideDescription.setText(slide_descs[position]);
    slideImageView.setImageBitmap(bitmap);
    container.addView(view);




    return view;

}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView((RelativeLayout)object);

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...