0

Я хочу, чтобы реализовать это в андроиде enter image description here Для этого я должен загружать изображения из папки активов и творю два HorizontalScrollView в XML-файл и загружать динамически ImageView в нем. Для загрузки ImageView Я использую этот кодИз памяти на Bitmap Android

LinearLayout myGallery = (LinearLayout) findViewById(R.id.mygallery); 

try { 
    String galleryDirectoryName = "gallery"; 
    String[] listImages = getAssets().list(galleryDirectoryName); 
    for (String imageName : listImages) { 
     InputStream is = getAssets().open(galleryDirectoryName + "/" + imageName); 
     Bitmap bitmap = BitmapFactory.decodeStream(is); 

     ImageView imageView = new ImageView(getApplicationContext()); 
     imageView.setLayoutParams(new ViewGroup.LayoutParams(100, 100)); 

     // imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setImageBitmap(bitmap); 

     LinearLayout.LayoutParams myGallery1= new LinearLayout.LayoutParams(100, 100); 
     myGallery1.setMargins(20, 0, 10, 0); 

     //its is also working 
     // imageView.setLayoutParams(myGallery1);  

     imageView.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       // diplayImage.setImageBitmap(bitmap); 
      } 
     }); 

     Log.e("GalleryWithHorizontalScrollView", e.getMessage(), e); 
    } 

// Повторяя приведенный выше код для загрузки ImageView во второй horizontalScrollView

LinearLayout myGallery2 = (LinearLayout) findViewById(R.id.mygallery2); 

try { 
    String galleryDirectoryName1 = "gallery2"; 
    String[] listImages2 = getAssets().list(galleryDirectoryName1); 
    for (String imageName : listImages2) { 
     InputStream is1 = getAssets().open(galleryDirectoryName1 + "/" + imageName); 
     Bitmap bitmap1 = BitmapFactory.decodeStream(is1); 

     ImageView imageView = new ImageView(getApplicationContext()); 
     imageView.setLayoutParams(new ViewGroup.LayoutParams(100, 100)); 

     // imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setImageBitmap(bitmap1); 

     LinearLayout.LayoutParams myGallery21= new LinearLayout.LayoutParams(100, 100); 
     myGallery21.setMargins(20, 40, 10, 0); 

     //its is also working 

     myGallery.addView(imageView,myGallery1); 
    } 
} catch (IOException e) { 
    myGallery2.addView(imageView,myGallery21); 
     } 
} catch (IOException e) { 
    Log.e("GalleryWithHorizontalScrollView", e.getMessage(), e); 
} 
} 

Если я один horizontalScrollView и нагрузки imageviews в нем, то он работает нормально, но для второго horizontalScrollView он дает мне ошибку в строке 76

Bitmap bitmap1 = BitmapFactory.decodeStream(is1); 

и мой кот Войти этот

05-14 11:13:26.000: E/AndroidRuntime(8350): FATAL EXCEPTION: main 
05-14 11:13:26.000: E/AndroidRuntime(8350): java.lang.OutOfMemoryError 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:577) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:643) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at com.example.gallery.MainActivity.onCreate(MainActivity.java:76) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.app.Activity.performCreate(Activity.java:4470) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.app.ActivityThread.access$600(ActivityThread.java:128) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.os.Looper.loop(Looper.java:137) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at android.app.ActivityThread.main(ActivityThread.java:4517) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
05-14 11:13:26.000: E/AndroidRuntime(8350):  at dalvik.system.NativeStart.main(Native Method) 
+0

сколько размер каждого образ? вам нужно переработать растровые изображения, когда они не используются – Raghunandan

+0

hmm, вы также можете [проверить эту ссылку] (http://developer.android.com/training/displaying-bitmaps/index.html) – CRUSADER

+0

всего 12 изображений в них 4 - 1024x780, а остальные - размер 200x200 .... где звонить bitmap.recycle() .... Я просто загружаю изображения 2 раза только в actitvity – Passion

ответ

1

Вы можете найти свой ответ here,

и самое главное, что вы должны рассмотреть, чтобы оптимизировать растровое изображение для миниатюры. Попробуйте это:

public static Bitmap decodeSampledBitmapFromInput(Context context, 
     InputStream input, int reqWidth, int reqHeight) { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(input, null, options); 

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

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeStream(input, null, options); 
} 

Здесь reqWidth является ширина эскиза и то же самое для reqHeight.

и для ListView попытаться реализовать кэш для ваших растровых изображений и попытаться получить их с помощью уникального ключа может быть имя файла (потому что вы не должны сохранить те же изображения несколько раз)

+0

hmm, вы также можете [проверить эту ссылку] (http://developer.android.com/training/displaying-bitmaps/index.html) – CRUSADER

+0

Вы также можете добавить options.inPurgeable = true; options.inInputShareable = true; –

0

Простой, то не нагрузку гораздо изображений ...

Используйте некоторое кэширование вроде LRUCache с фиксированным размером. Если изображение отсутствует, вы должны сначала загрузить его. Если увеличить производительность и исправить ваш OOME

http://developer.android.com/reference/android/util/LruCache.html

+0

google play store имеет много изображений. вы можете прокручивать список вниз. «Простой, не загружайте много изображений» - это не ответ. ленивая загрузка или UIL должны помочь в этом случае – Raghunandan

+0

Они управляют памятью, так что они не загружаются все раз. То, где LRU приходит играть – Kitesurfer

0

Вы должны получить доступ изображения с помощью BitmapFactory.Options

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize =8; 

затем

Bitmap bitmap1 = BitmapFactory.decodeStream(is1,null,options); 

Так что только необходимый размер растрового изображения загружается в памяти

Для более см Loading Large Bitmaps Efficiently

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