2016-12-16 5 views
1

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

Его хорошо, когда Пользователь выбирает только 1 или 2 изображения из Галлари. Но, Проблема приложение получает слишком много нагрузки, когда пользователь выбирает более 3 изображений. Он также принимает нагрузку, пока я вводил символы в свой EditText.

Здесь я преобразование изображений в Base64, как показано ниже, чтобы отправить его на сервер:

public void JsonArray() { 
    if (arrayListImages != null) { 
     jsonItemArray = new JSONArray(); 

     JSONObject jsonObjItemImages = null; 
     JSONArray jsonArrayItemImages = null; 

     String strBase64_ItemImage1 = ""; 
     String strBase64_ItemImage2 = ""; 
     String strBase64_ItemImage3 = ""; 
     String strBase64_ItemImage4 = ""; 

     for (int i = 0; i < arrayListImages.size(); i++) { 
      JSONObject jObj = new JSONObject(); 

       if (arrayListImages.get(i).getStrItemImagePath1() != null) { 
        strBase64_ItemImage1 = Common.convertToBase64(arrayListImages.get(i).getStrItemImagePath1()); 
       } 
       if (arrayListImages.get(i).getStrItemImagePath2() != null) { 
        strBase64_ItemImage2 = Common.convertToBase64(arrayListImages.get(i).getStrItemImagePath2()); 
       } 
       if (arrayListImages.get(i).getStrItemImagePath3() != null) { 
        strBase64_ItemImage3 = Common.convertToBase64(arrayListImages.get(i).getStrItemImagePath3()); 
       } 
       if (arrayListImages.get(i).getStrItemImagePath4() != null) { 
        strBase64_ItemImage4 = Common.convertToBase64(arrayListImages.get(i).getStrItemImagePath4()); 
       } 

       jsonObjItemImages = new JSONObject(); 
       jsonArrayItemImages = new JSONArray(); 

       if (strBase64_ItemImage1 != null) { 
        JSONObject jsonObjectImage1 = new JSONObject(); 
        jsonObjectImage1.put("name", strBase64_ItemImage1); 
        jsonArrayItemImages.put(jsonObjectImage1); 
        strBase64_ItemImage1 = null; 
       } 
       if (strBase64_ItemImage2 != null) { 
        JSONObject jsonObjectImage2 = new JSONObject(); 
        jsonObjectImage2.put("name", strBase64_ItemImage2); 
        jsonArrayItemImages.put(jsonObjectImage2); 
        strBase64_ItemImage2 = null; 
       } 
       if (strBase64_ItemImage3 != null) { 
        JSONObject jsonObjectImage3 = new JSONObject(); 
        jsonObjectImage3.put("name", strBase64_ItemImage3); 
        jsonArrayItemImages.put(jsonObjectImage3); 
        strBase64_ItemImage3 = null; 
       } 
       if (strBase64_ItemImage4 != null) { 
        JSONObject jsonObjectImage4 = new JSONObject(); 
        jsonObjectImage4.put("name", strBase64_ItemImage4); 
        jsonArrayItemImages.put(jsonObjectImage4); 
        strBase64_ItemImage4 = null; 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      try { 
       if (jsonArrayItemImages != null) { 
        jsonObjItemImages.put("images", jsonArrayItemImages); 
        if (jsonObjItemImages != null) { 
         jObj.put("photo", jsonObjItemImages); 
        } 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      jsonItemArray.put(jObj); 
     } 
    } 

Функции для выбора изображения из Gallary, как показано ниже:

private void onSelectFromGalleryResult(Intent data) { 
    Uri selectedImage = data.getData(); 
    String[] filePath = {MediaStore.Images.Media.DATA}; 
    Cursor c = myActivity.getContentResolver().query(selectedImage, filePath, null, null, null); 
    c.moveToFirst(); 

    int columnIndex = c.getColumnIndex(filePath[0]); 
    String picturePath = c.getString(columnIndex); 
    c.close(); 
    switch (flagImage) { 

     case 1: 
      fileImagePath1 = new File(picturePath); 
      selectImageView(0, fileImagePath1, 1); 
      break; 

     case 2: 
      fileImagePath2 = new File(picturePath); 
      selectImageView(0, fileImagePath2, 2); 
      break; 

     case 3: 
      fileImagePath3 = new File(picturePath); 
      selectImageView(0, fileImagePath3, 3); 
      break; 

     case 4: 
      fileImagePath4 = new File(picturePath); 
      selectImageView(0, fileImagePath4, 4); 
      break; 

    } 
} 

Ниже приводится функция преобразовать изображение в Base64:

public static String convertToBase64(String path) { 
    String encodedImage4 = ""; 
    try { 
     BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     Bitmap bitmap = decodeSampledBitmapFromResource(path, 200, 200); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
     byte[] byteArrayImage = baos.toByteArray(); 
     encodedImage4 = Base64.encodeToString(byteArrayImage, Base64.DEFAULT); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return encodedImage4; 
} 

Теперь любой сказать мне, что КАК МЫ МОЖЕМ ЗАГРУЗИТЬ иЗОБРАЖЕНИЯ в ImageView наилучшим и эффективным способом?

или

Есть ли что-нибудь в своем коде, чтобы улучшить? Буду благодарен за ваше предложение.

Спасибо.

+0

Дон; т проходят вокруг изображения таким образом. Передайте путь к файлу и откройте файл. – Karakuri

+0

Используйте небольшую библиотеку для галереи, например https://android-arsenal.com/details/1/4395 – Qamar

+0

Измените размер изображения, а затем возьмите base64 Строка и байты – Qamar

ответ

0

Для ускорения загрузки, один вариантов является использование

GalleryConfig config = new GalleryConfig.Build() 
         .limitPickPhoto(1) 
         .singlePhoto(true) 
         .hintOfPick("Select image") 
         .filterMimeTypes(new String[]{"image/jpeg"}) 
         .build(); 
GalleryActivity.openActivity(MainActivity.this, reqCode, config); 

Проверка TelegramGallery для дальнейшей реализации

0

Я получил решение, как показано ниже:

я загружал изображения до, как показано ниже образом:

Picasso.with(getActivity()).load(fileImagePath1).into(imgviewItemImageHouseHoldDialog1); 

Но, теперь я добавил .resize(400,400).onlyScaleDown(), как показано ниже:

Picasso.with(getActivity()).load(fileImagePath1).resize(400,400).onlyScaleDown().into(imgviewItemImageHouseHoldDialog1); 

Здесь, она будет изменять размер изображения с 400 * 400 и onlyScaleDown() будет изменить размер изображения, если его больше, чем 400 * 400 размер.

СОВЕРШЕННО.

Но, его давая мне ниже ошибки наконец:

java.lang.OutOfMemoryError: Failed to allocate a 11315274 byte allocation with 6270128 free bytes and 5MB until OOM