2015-12-31 82 views
0

我在应用程序中使用了crashylytics。它已经生产了大约2个月。我已经解决了一些崩溃问题,但是最近几天我得到了一个堆栈跟踪,这个堆栈跟踪并没有指向我的代码(甚至是一个活动),在这一点上崩溃发生。无法理解此堆栈跟踪(parse.com)

Fatal Exception: java.lang.OutOfMemoryError 
     at org.apache.http.impl.io.ContentLengthInputStream.close(ContentLengthInputStream.java:120) 
     at org.apache.http.conn.BasicManagedEntity.eofDetected(BasicManagedEntity.java:161) 
     at org.apache.http.conn.EofSensorInputStream.checkEOF(EofSensorInputStream.java:239) 
     at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:179) 
     at com.parse.ParseIOUtils.copyLarge(ParseIOUtils.java:129) 
     at com.parse.ParseIOUtils.copyLarge(ParseIOUtils.java:106) 
     at com.parse.ParseIOUtils.copy(ParseIOUtils.java:81) 
     at com.parse.ParseIOUtils.toByteArray(ParseIOUtils.java:55) 
     at com.parse.ParseRESTObjectBatchCommand.onResponse(ParseRESTObjectBatchCommand.java:66) 
     at com.parse.ParseRequest$3.then(ParseRequest.java:229) 
     at com.parse.ParseRequest$3.then(ParseRequest.java:225) 
     at bolts.Task$10.run(Task.java:486) 
     at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97) 
     at bolts.Task.completeAfterTask(Task.java:482) 
     at bolts.Task.continueWithTask(Task.java:358) 
     at bolts.Task.continueWithTask(Task.java:369) 
     at bolts.Task$8.then(Task.java:415) 
     at bolts.Task$8.then(Task.java:407) 
     at bolts.Task$10.run(Task.java:486) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:841) 

而这。

Fatal Exception: java.lang.OutOfMemoryError 
     at org.apache.http.util.ByteArrayBuffer.<init>(ByteArrayBuffer.java:53) 
     at org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:82) 
     at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:70) 
     at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83) 
     at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170) 
     at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106) 
     at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129) 
     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:172) 
     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:587) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:511) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:489) 
     at com.parse.ParseApacheHttpClient.execute(ParseApacheHttpClient.java:97) 
     at com.parse.ParseRequest$3.then(ParseRequest.java:228) 
     at com.parse.ParseRequest$3.then(ParseRequest.java:225) 
     at bolts.Task$10.run(Task.java:486) 
     at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97) 
     at bolts.Task.completeAfterTask(Task.java:482) 
     at bolts.Task.continueWithTask(Task.java:358) 
     at bolts.Task.continueWithTask(Task.java:369) 
     at bolts.Task$8.then(Task.java:415) 
     at bolts.Task$8.then(Task.java:407) 
     at bolts.Task$10.run(Task.java:486) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:841) 

通常死机我发现一行

at com.justmedit.datatrix.MainActivity$1.done(MainActivity.java:90)

指向我导致崩溃的行。 有人可能请给我建议,为什么会发生这种情况或可能性,以便我可以调查此问题并在下一个版本中修复它。谢谢!

我使用缩放位图

添加的代码 -

public Bitmap ScaleImage(String value, float dimension){ 
     Bitmap bitmap = BitmapFactory.decodeFile(value); 
     int width = bitmap.getWidth(); 
     int height = bitmap.getHeight(); 
     float scale; 
     if (width>height){scale=dimension/width;} 
     else {scale=dimension/height;} 
     ExifInterface exif; 
     Matrix matrix = new Matrix(); 
     try { 
      exif = new ExifInterface(value); 
      int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0); 
      Log.d("EXIF", "Exif: " + orientation); 
      if (orientation == 6) { 
       matrix.postRotate(90); 
       Log.d("EXIF", "Exif: " + orientation); 
      } else if (orientation == 3) { 
       matrix.postRotate(180); 
       Log.d("EXIF", "Exif: " + orientation); 
      } else if (orientation == 8) { 
       matrix.postRotate(270); 
       Log.d("EXIF", "Exif: " + orientation);} 

     }catch (IOException e){e.printStackTrace();} 
     matrix.postScale(scale, scale); 
     Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height, matrix, true); 
     return resizedBitmap; 
    } 

这让我通过SD卡和一个浮点数这就决定了最大尺寸的大小对图像的位置,一旦图像被重新调整。

+0

我倾向于认为这个问题或多或少是你面临的问题; http://stackoverflow.com/questions/26411710/fatal-exception-outofmemoryerror。 – harism

+0

我也相信崩溃可能是由于使用Parse上传多个位图。如果我需要上传6-7位图,每个位图大小为200kb,将它们保存为解析文件并将它们指向原始对象,那么这将是一种有效的方法吗?在onClick中编写代码本身导致用户界面冻结 –

回答

1

您必须在样本大小中创建位图。看看Loading bitmaps efficiently

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); 
     } 
     } 

     return inSampleSize; 
     } 

下面的方法将在样本大小从Byte阵列解码Bitmap

public static Bitmap decodeSampledBitmapFromBytes(byte[] bytes, int reqWidth, 
     int reqHeight) { 

     Bitmap bm = null; 
     // First decode with inJustDecodeBounds=true to check dimensions 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); 

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

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 
     bm = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); 

     return bm; 
     } 

     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); 
     } 
     } 

     return inSampleSize; 
     } 

100是高度和宽度,您可以根据自己的需要进行修改。

Bitmap bitmap = decodeSampledBitmapFromBytes(bytes, 100, 100); 

希望它能帮上忙。

+0

我已经看到了这段代码,并用它进行了一些更改。我已经添加了新的代码。请帮助我。谢谢 –