2013-07-25 4 views
0

Загрузите изображение в растровое изображение из javaCameraView. Этот отправляется в async-задачу, чтобы отправить его в php-файл. В течение первой-второй проблем нет. После этого времени у меня проблема с потоком, но я не нашел решения. Это LogCat:Android - фатальное исключение AsyncTask

07-25 16:36:29.492: E/AndroidRuntime(17507): FATAL EXCEPTION: AsyncTask #5 
    07-25 16:36:29.492: E/AndroidRuntime(17507): java.lang.RuntimeException: An error occured while executing doInBackground() 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at java.lang.Thread.run(Thread.java:856) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): Caused by: java.lang.OutOfMemoryError 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at java.lang.String.<init>(String.java:375) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at java.lang.String.<init>(String.java:238) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at android.util.Base64.encodeToString(Base64.java:456) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at com.example.objectDetect.SendData.getStringFromBitmap(SendData.java:186) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at com.example.objectDetect.SendData.doInBackground(SendData.java:63) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at com.example.objectDetect.SendData.doInBackground(SendData.java:1) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    07-25 16:36:29.492: E/AndroidRuntime(17507): ... 5 more 

Я думаю, что проблема в этой функции, но я не знаю, почему:

private String getStringFromBitmap(Bitmap bitmapPicture) 
{ 
    if(!bitmapPicture.isRecycled()) 
    { 
     final int COMPRESSION_QUALITY = 100; 
     String encodedImage; 
     ByteArrayOutputStream byteArrayBitmapStream = new ByteArrayOutputStream(); 
     bitmapPicture.compress(Bitmap.CompressFormat.PNG, COMPRESSION_QUALITY, byteArrayBitmapStream); 
     byte[] b = byteArrayBitmapStream.toByteArray(); 
     encodedImage = Base64.encodeToString(b, Base64.DEFAULT); 
     return encodedImage; 
    } 
    else 
    { 
     return null; 
    } 
} 

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

Herebelow LogCat:

07-26 09:42:50.491: E/AndroidRuntime(31291): FATAL EXCEPTION: Thread-27487 
    07-26 09:42:50.491: E/AndroidRuntime(31291): java.lang.OutOfMemoryError 
    07-26 09:42:50.491: E/AndroidRuntime(31291): at android.graphics.Bitmap.nativeCreate(Native Method) 
    07-26 09:42:50.491: E/AndroidRuntime(31291): at android.graphics.Bitmap.createBitmap(Bitmap.java:640) 
    07-26 09:42:50.491: E/AndroidRuntime(31291): at android.graphics.Bitmap.createBitmap(Bitmap.java:620) 
    07-26 09:42:50.491: E/AndroidRuntime(31291): at com.example.objectDetection.objectDetectionView$1.run(objectDetectionView.java:197) 

Заранее спасибо за вашу помощь.

+4

вам нужно уменьшить масштаб растрового изображения. http://developer.android.com/training/displaying-bitmaps/load-bitmap.html – Raghunandan

+0

Да, может быть, но эта проблема возникает около 1 или двух минут теста ... – user2619284

+2

действительно нужна кодировка base-64? Работа с двоичными данными будет намного более эффективной ... эта операция потребляет слишком много памяти – CSmith

ответ

0

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

private Bitmap loadImageFromNetwork(String urlToUse) { 
    Bitmap img = null; 
    URL url; 
    try { 
     //A uniform resource locator aka the place where the data is  
     //located 
     url = new URL(urlToUse); 
     //Opens an HTTPUrlConnection and downloads the input stream into a 
     //Bitmap 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     // Prevents loading of image into memory and just ascertains bounds and memory footprint 
     options.inJustDecodeBounds = true; 

     BitmapFactory.decodeStream(url.openStream(),null,options); // gather image data 
     options.inSampleSize = Photo.calculateInSampleSize(options, 
       Photo.THUMBNAIL_WIDTH, Photo.THUMBNAIL_HEIGHT); 
     options.inJustDecodeBounds = false; 
     img = BitmapFactory.decodeStream(url.openStream(),null,options); 

    } catch (MalformedURLException e) { 
     Log.i("PAR", "URL is malformed"); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.i("PAR", "Failed to decode Bitmap"); 
     e.printStackTrace(); 
    } 

    return img; 

} // end load function 


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) { 
     if (width > height) { 
      inSampleSize = Math.round((float)height/(float)reqHeight); 
     } else { 
      inSampleSize = Math.round((float)width/(float)reqWidth); 
     } // end if 
    } // end out if 
    return inSampleSize; 
} 

Ключевое значение, которое необходимо установить, это начальная нагрузка не включает в себя все изображение. Флаг inJustDecodeBounds имеет значение true, что делает точно так, как оно звучит. Он только расшифровывает границы, поэтому вы можете заранее определить, может ли изображение быть слишком большим. Мое предложение состоит в том, чтобы определить границы и другие соответствующие данные, затем выполнить настройку перед загрузкой всего изображения. В этом примере я конвертирую большие изображения в миниатюры.

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

+0

Проблема заключается в том, что битмап загружается из представления javacamera. Поэтому я загружаю матрицу. – user2619284

+0

Вероятно, вы должны включить дополнительную информацию о своей проблеме в вопрос. Трудно дать хороший ответ тому, что предоставляется. –

+0

Я загружаю изображение в растровое изображение из javaCameraView. Этот отправляется в async-задачу, чтобы отправить его в php-файл. – user2619284

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