2014-01-30 3 views
0

Я знаю, что многие вопросы относительно этого уже отправлены в переполнение стека. Фактически я прошел через это и реализовал некоторые методы. Но все равно не повезло, он все еще показывает ту же ошибку, что и предыдущая .Это мой код.java.lang.OutOfMemoryError в Amazon Kindle Fire

public class ViewPagerAdapter extends PagerAdapter { 

Activity activity; 
int imageArray[]; 
LayoutInflater inflater; 
Typeface tf; 
ImageView imageView; 
ArrayList<Bitmap> list=new ArrayList<Bitmap>();; 
Bitmap bitmap; 
public ViewPagerAdapter(Activity act, int[] imgArra) { 
    imageArray = imgArra; 
    activity = act; 
    inflater = (LayoutInflater) act 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    tf = Typeface.createFromAsset(activity.getAssets(), "Times Roman.ttf"); 
} 

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

public Object instantiateItem(View collection, int position) { 
    // System.out.println("instantiate.... " + position); 
    // ImageView view = new ImageView(activity); 
    // view.setBackgroundColor(Color.parseColor("#909090")); 
    // view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
    // LayoutParams.FILL_PARENT)); 
    // view.setImageResource(imageArray[position]); 
    // ((ViewPager) collection).addView(view, 0); 
    // return view; 
    try { 

     View view; 

     view = inflater.inflate(R.layout.item_starting_screen, null); 
     TextView textView = (TextView) view 
       .findViewById(R.id.txt_heading_starting_screen); 
     textView.setText(activity.getResources().getStringArray(
       R.array.txt_starting_screen)[position]); 
     textView.setTypeface(tf, Typeface.BOLD_ITALIC); 
     imageView=(ImageView) view.findViewById(R.id.img_starting_screen); 
         imageView.setImageBitmap(BitmapFactory.decodeResource(activity.getResources(), imageArray[position])); 
     bitmap=((BitmapDrawable)imageView.getDrawable()).getBitmap(); 
     list.add(bitmap); 
     ((ViewPager) collection).addView(view, 0); 
     return view; 
    } catch (Exception e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
     return null; 
    } 

} 

@Override 
public void destroyItem(View arg0, int arg1, Object arg2) { 

    ((ViewPager) arg0).removeView((View) arg2); 


} 

@Override 
public boolean isViewFromObject(View arg0, Object arg1) { 
    return arg0 == ((View) arg1); 
} 

@Override 
public Parcelable saveState() { 
    return null; 
} 
public void clearbitmap(int flag) 
{ 
    if(flag==1) 
    { 
     for(int i=0;i<list.size();i++) 
     { 
      bitmap=list.get(i); 
      bitmap.recycle(); 
     } 


    } 
} 

} 

И после многого поиска я придумал метод утилизации, но все же он не работает. Когда я запускаю свое приложение в первый раз, нет проблем. Во второй раз он сбой.

У меня есть 5 страниц, как ввод для приложения, и когда пользователь закончил с запуском приложения. Когда он запускается, я устанавливаю флаг и вызываю метод clearbitmap и использую метод recycle для очистки растрового изображения.

Я уже уменьшил размер своих изображений, но все еще не работал. Но когда я использую изображения с низким разрешением, это работает. Но я не хочу этого. Я использую Amazon Kindle Fire как мое тестовое устройство. И эта проблема только с этим устройством. На остальных устройствах он работает нормально.

я по ссылке, данное rajahsekar и я изменил код, как это до сих пор его врезаться

 BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(activity.getResources(),  imageArray[position], options); 
     int imageHeight = options.outHeight; 
     int imageWidth = options.outWidth; 
           imageView.setImageBitmap(decodeSampledBitmapFromResource(activity.getResources(),imageArray[ position],imageWidth,imageHeight)); 

И вычислили растровое С помощью этих методов

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; 
} 
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, 
     int reqWidth, int reqHeight) { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(res, resId, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeResource(res, resId, options); 
} 

Но все-таки не повезло.

ответ

0

Сжатие растрового изображения и сохранение его в кэш-памяти. Проверьте ниже ссылку http://developer.android.com/training/displaying-bitmaps/load-bitmap.html.

Удалите все ваши растровые изображения из списка.

+0

Nope все еще не работает. –

+0

Я принимаю это как ответ. Не полностью решил мою проблему, однако, когда я изменил изображениеView.setImageBitmap (decodeSampledBitmapFromResource (activity.getResources(), imageArray [position], 200,200)); как это, он начинает работать. Спасибо за эту ссылку .. –

+0

Удалите код на вашем языке и проверьте его один раз. – rajahsekar

1

Кусок советы, хотя это не может быть ответа

public void clearbitmap(int flag) 
{ 
    if(flag==1) 
    { 
     for(int i=0;i<list.size();i++) 
     { 
      bitmap=list.get(i); 
      bitmap.recycle(); 
     } 


    } 
} 

вместо

public void clearbitmap(int flag) 
{ 
    if(flag==1) 
    { 
     list.removeAll(); 

    } 
} 

И что еще более важно.

ArrayList следует использовать только в том случае, если вы хотите получить доступ по индексу. в любом другом случае используйте LinkedList. В ArrayList удаление элемента - это O (n) время и серьезное наказание, где в качестве LinkedList удаление элемента - O (1).

С момента удаления элемента в ArrayList все последующие элементы будут наведены индексом, скопировав элементы. Я бы не стал подробно объяснять, но вы можете проверить это, посмотрев на коллекцию wiki

+0

Спасибо за совет, я рассмотрю его. –

Смежные вопросы