Загрузка большого количества растровых изображений в социальном приложении без использования Java-кучи в Android?
В основном я делаю изображение с возможностью прокрутки. И это работает. Но при профилировании памяти я не думаю, что мои пользователи смогут загружать много изображений без сбоев. Я также делал профилирование памяти для приложения Instagram и узнал, что они загружают много изображений, но их размер кучи остается постоянный независимо от того, сколько изображений у меня на экране. Может быть 3 варианта
1) либо они используют встроенную память для рендеринга изображений, но я пытался реализовать это, но я не могу рендерить изображения без использования кучи (если вы можете помочь мне в этом, это было бы очень здорово)
2) они используют inSampleSize больше 4, но это действительно невозможно, так как изображения четкие и среднего качества.
3) Я чувствую запах родного интерфейса openGL в этом, не так ли?
Я что-то упускаю!! пожалуйста помоги!! Я использую "ImageView" для загрузки растровых изображений
Даже при профилировании памяти "Vine app" я обнаружил, что их куча Java остается постоянной, тогда как моя куча Java увеличивается с увеличением количества загруженных растровых изображений
Я использую эту библиотеку прямо сейчас https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations
@Override
protected String doInBackground(String[] Params) {
ParseFile fileObject = (ParseFile)photoObject.get("image");
try {
dataMain = fileObject.getData() ;
if(dataMain!= null) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inSampleSize = 1;
options.inSampleSize = calculateInSampleSize(options, context.getResources().getDisplayMetrics().widthPixels,
context.getResources().getDisplayMetrics().widthPixels );
options.inJustDecodeBounds = false;
options.inPurgeable = true;
bitmapHolder = new JniBitmapHolder(BitmapFactory.decodeByteArray(dataMain, 0, dataMain.length, options));
bitmapHolder.scaleBitmap(widthPixels ,widthPixels* bitmapHolder.getBitmap().getHeight() / bitmapHolder.getBitmap().getWidth(), JniBitmapHolder.ScaleMethod.NearestNeighbour);
//bmp = null ;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
return "done";
}
@Override
protected void onPostExecute(String bitmap) {
ImageView imageView = imageViewReference.get();
if(imageView!= null && bitmapHolder.getBitmap() != null) {
imageView.setImageBitmap(bitmapHolder.getBitmapAndFree());
bitmapHolder = null;
}
}
2 ответа
Я просто переосмыслил это, оказалось, что вид переработчика только что сделал работу
Используйте Facebook Fresco. Он использует Ashmem для хранения изображений.
Вы также можете попробовать повторно использовать растровые изображения. Читайте официальные документы, чтобы узнать больше об эффективной загрузке растровых изображений.
Также рассмотрите возможность использования библиотек Glide или Picasso вместо ручной загрузки изображений.