E/Volley:[1624]NetworkDispatcher.processRequest:未处理的异常java.lang.IllegalStateException:Can';不要压缩回收的位图
我正在制作一个程序,以采取截图,并上传到我的服务器数据库 这是我的代码:E/Volley:[1624]NetworkDispatcher.processRequest:未处理的异常java.lang.IllegalStateException:Can';不要压缩回收的位图,java,android,bitmap,android-volley,Java,Android,Bitmap,Android Volley,我正在制作一个程序,以采取截图,并上传到我的服务器数据库 这是我的代码: private class ImageAvailableListener implements ImageReader.OnImageAvailableListener { @Override public void onImageAvailable(ImageReader reader) { Log.d(TAG, "onImageAvailable&qu
private class ImageAvailableListener implements ImageReader.OnImageAvailableListener {
@Override
public void onImageAvailable(ImageReader reader) {
Log.d(TAG, "onImageAvailable");
FileOutputStream fos = null;
Bitmap bitmap = null;
String name = null;
try (Image image = mImageReader.acquireLatestImage()) { // acquire last image
if (image != null) {
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * mWidth;
// create bitmap
bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
Screenshot screenshot = new Screenshot(bitmap, Integer.toString(IMAGES_PRODUCED));
ImageSender.getInstance().uploadImage(screenshot);
IMAGES_PRODUCED++;
Log.e(TAG, "captured image: " + IMAGES_PRODUCED);
}
} catch (Exception e) {
e.printStackTrace();
}
**if (bitmap != null) { // this is the problem
bitmap.recycle();
}**
}
这是我的截击库代码:
@NonNull
private byte[] getFileDataFromDrawable(@NonNull Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
**bitmap.compress(Bitmap.CompressFormat.PNG, 80, byteArrayOutputStream);** // error
return byteArrayOutputStream.toByteArray();
}
private void uploadBitmap(final Screenshot screenshot) {
//our custom volley request
VolleyMultipartRequest volleyMultipartRequest = new VolleyMultipartRequest(Request.Method.POST, Settings.UPLOAD_URL,
new Response.Listener<NetworkResponse>() {
@Override
public void onResponse(NetworkResponse response) {
try {
JSONObject obj = new JSONObject(new String(response.data));
Toast.makeText(context.getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context.getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
}
}) {
/*
* If you want to add more parameters with the image
* you can do it here
* here we have only one parameter with the image
* which is tags
* */
@NonNull
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("tags", "tags");
return params;
}
/*
* Here we are passing image by renaming it with a unique name
* */
@NonNull
@Override
protected Map<String, DataPart> getByteData() {
Map<String, DataPart> params = new HashMap<>();
// long imagename = System.currentTimeMillis();
params.put("pic", new DataPart(screenshot.getName() + ".png", getFileDataFromDrawable(screenshot.getBitmap())));
return params;
}
};
//adding the request to volley
Volley.newRequestQueue(context).add(volleyMultipartRequest);
}
它可以正常工作,但过了很长时间,我的应用程序崩溃了
我如何解决?我使用阻塞队列插入屏幕截图。线程完成后,获取屏幕截图并在函数private void uploadBitmap(最终屏幕截图)处传递它们
谢谢
//if (bitmap != null) {
// bitmap.recycle();
//}