2013-10-12 2 views
0


Я пытаюсь получить изображения (пути) от sqldatabase и поместить изображения в gridview. Но я часто получаю OutOfMemoryError. Это мой код:OutofMemory ImageAdapter

public void dos(File myDir) 
{ 
    Cursor test; 
    MyDB con = new MyDB(mContext); 
    test = con.selectImages(); 

    List<String> array = new ArrayList<String>(); 
    while(test.moveToNext()){ 
     String uname = test.getString(2); 
     array.add(uname); 
    } 


    List<File> list = new ArrayList<File>(); 

    for (int i = 0; i < array.size(); i++) { 
     list.add(new File(myDir + "/" + array.get(i))); 
    } 

    System.out.println(list); 

    for (File file : list) { 
     mThumbs.add(Drawable.createFromPath(file.getPath())); 
    } 
} 

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(230, 310)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(0, 0, 0, 0); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageDrawable(mThumbs.toArray(new Drawable[list.size()])[position]); 
    return imageView; 
} 

И это ошибка:
10-12 10:56:43.820 19786-19786/de.treevo.app E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:530) at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:303) at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:329) at android.graphics.drawable.Drawable.createFromPath(Drawable.java:916) at de.treevo.app.ImageAdapter.dos(ImageAdapter.java:76) at de.treevo.app.main_list.onCreate(main_list.java:75) at android.app.Activity.performCreate(Activity.java:5133) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) at android.app.ActivityThread.access$600(ActivityThread.java:153) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5289) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) at dalvik.system.NativeStart.main(Native Method)

Мой код в main_list.java:

ImageAdapter image = new ImageAdapter(this); 
image.dos(filedir) 

GridView gridview = (GridView) findViewById(R.id.gridview); 
gridview.setAdapter(image); 

Мой вопрос: Что я могу сделать что это просто работа без каких-либо ошибок. Мое тестовое устройство - это Nexus 7 от Google.

Редактировать: Спасибо за ответ meredrica. Это объясняет многое, когда каждое изображение хранится в памяти. Мой новый вопрос: что еще можно было бы сделать id из изображений изображений из базы данных и поместить их в gridview?

+0

@ ternes3- просто добавьте разрешение для внешнего хранилища в вашем манифесте. Xml – FarhaSameer786

+0

@ FarhaSameer786: Спасибо за ответ, но проблема все еще существует. – ternes3

+0

@ ternes3 - просто вставьте свой полный код с помощью файла mainfest.xml с вашим файлом logcat после добавления внешнего разрешения на хранение. – FarhaSameer786

ответ

1

Вы пропускаете память влево и вправо. Вы также держите каждое изображение в памяти, это никогда не сработает. Я также уверен, что вы скоро попытаетесь загрузить изображение, которое слишком велико, что снова убьет вашего барана. Вам нужно загрузить изображения в правильной шкале.

Android позволяет использовать фиксированный набор ОЗУ для каждого приложения, которое будет использоваться, а затем отключит дополнительное устройство для приложения, которое приведет к ошибке OOME.

Судя по вашему коду, вы действительно должны прочитать android development guides, поскольку вы программируете, как вы используете java для рабочего стола. Это приведет к созданию приложения с ошибкой, которое приведет к сбою и исправлению кода. Я не имею в виду это как преступление, а скорее предупреждение и совет. Я видел это много раз раньше.

+0

Спасибо за ответ. Это объясняет многое, когда каждое изображение хранится в памяти. Что еще можно было бы сделать, чтобы лишить имена изображений из базы данных и поместить их в gridview? – ternes3

+1

Загрузите элементы в метод 'getView()' и убедитесь, что вы загрузили их с размерами из официальных официальных документов android для этого: https://developer.android.com/training/displaying-bitmaps/load-bitmap.html. , Вы также можете сделать свою жизнь менее болезненной и использовать picasso: http://square.github.io/picasso/ – meredrica

+0

Picasso is perfect Спасибо: D – ternes3

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