【问题标题】:ConcurrentModificationException-ArrayListConcurrentModificationException-ArrayList
【发布时间】:2017-10-12 06:07:14
【问题描述】:

我浏览了文档和多个相关帖子,但无法检测到我的代码中发生异常的位置和原因。我正在尝试单击图像,将其显示在 recyclerview 中(为此我将路径存储在 ArrayList 中)并上传它们。我有两个 ArrayList——一个用于在 recyclerView 中显示较小的位图,一个用于上传较大的位图。

这是捕获图像的代码:

           public void captureImage(){
    camera.setCameraListener(new CameraListener() {
        @Override
        public void onPictureTaken(byte[] picture) {
            super.onPictureTaken(picture);
            upload_bitmap= BitmapFactory.decodeByteArray(picture, 0, picture.length);
            large_bitmap=getResizedBitmap(upload_bitmap,500);
            result = BitmapFactory.decodeByteArray(picture, 0, picture.length);
            bytes = new ByteArrayOutputStream();
            result.compress(Bitmap.CompressFormat.JPEG, 25, bytes);
            Bitmap newResult=getResizedBitmap(result,400,400);
            String fileNameSmall = new SimpleDateFormat("yyyyMMddHHmmss'.txt'").format(new Date());
            String fileNameLarge= new SimpleDateFormat("HHmmss'.txt'").format(new Date());
            path = MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), newResult, fileNameSmall, null);
            large_bitmap_path= MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), large_bitmap, fileNameLarge, null);
            c = Calendar.getInstance();
            df = new SimpleDateFormat("yyyy-MM-dd");
            tf=new SimpleDateFormat("hh.mm.ss  a");
            formattedTime=tf.format(c.getTime());
            formattedDate = df.format(c.getTime());
            fileName="999999_".concat(formattedDate.toString()).concat(" at ").concat(formattedTime.toString()).concat(".jpg");
            String uploadName=fileName;
            Log.e("fileName",uploadName);
            fileNameList.add(fileName);
            horizontalList.add(path);
            large_bitmapList.add(Uri.parse(large_bitmap_path));
            i++;
            iterator = horizontalList.iterator();
            recycleViewAdapter.notifyDataSetChanged();

        }
    });
    camera.captureImage();

}

这是上传图片的代码:

      final ProgressDialog loading = ProgressDialog.show(this,"Uploading...","Please wait...",false,false);
    StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String s) {
                    //Disimissing the progress dialog
                    loading.dismiss();
                    //Showing toast message of the response
                    Toast.makeText(CameraActivity.this, s , Toast.LENGTH_LONG).show();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    //Dismissing the progress dialog
                    loading.dismiss();
                    //Showing toast
                    Toast.makeText(CameraActivity.this, "error", Toast.LENGTH_LONG).show();
                }
            }){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
         String img_path=image_path;
            //Converting Bitmap to String

            //Creating parameters
            Map<String,String> parameters = new Hashtable<String, String>();
            //Adding parameters
            parameters.put("dateTime", "2017-10-09 01.43 PM");
            parameters.put("type", "image");
            parameters.put("fileName",fileNameList.get(j));
            j++;
            //returning parameters
            return parameters;
        }
    };

    //Creating a Request Queue
    RequestQueue requestQueue = Volley.newRequestQueue(this);

    //Adding request to the queue
    requestQueue.add(stringRequest);
} 

显然我不确定异常发生在哪里。有时工作,但有时,一旦我打开相机,它就会崩溃。 另外,存储两张不同大小的图像不是一个好主意,欢迎提出任何建议。 请尝试提供帮助而不是投反对票。谢谢。

Logcat

java.util.ConcurrentModificationException 在 java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:346) 在 java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:366) 在 android.hardware.Camera$Parameters.flatten(Camera.java:4243) 在 android.hardware.Camera.setParameters(Camera.java:3215) 在 com.flurgle.camerakit.Camera1.setFlash(Camera1.java:139) 在 com.flurgle.camerakit.Camera1.adjustCameraParameters(Camera1.java:376) 在 com.flurgle.camerakit.Camera1.openCamera(Camera1.java:317) 在 com.flurgle.camerakit.Camera1.start(Camera1.java:85) 在 com.flurgle.camerakit.CameraView$3.run(CameraView.java:216) 在 java.lang.Thread.run(Thread.java:818)

PS Camerakit 是我用来创建自定义适配器的库

【问题讨论】:

  • 你能把错误日志也贴出来吗
  • 是的。给我一分钟
  • 看起来您的操作不是线程安全的。你是从不同的线程调用一个方法吗?还有captureImage 方法,你到底在哪里调用它。此外,您的代码对内存不友好。您正在创建太多位图。一种更好的方法是创建一个新活动并添加一个打开它的工厂。从新活动中捕获图像,然后仅将图像的 URI 推送到 recyclerview。
  • 我正在从不同的方法调用一个方法。在 button.OnClickListener 上调用 captureImage。我知道代码对内存不友好。处理完异常后,我会尽快处理。
  • onClickListener 方法写在哪里?在 recyclerview 适配器里面?

标签: android exception bitmap


【解决方案1】:

这里发生的问题是您尝试在按钮的每个onClick 事件上设置一个新的cameraListener

CameraKit 库有一个函数,camera.captureImage() 在你的 onClick 实现中使用这个方法。 M

cameraListener 移出onClick 实现。

异常清楚地表明您正在尝试同时修改一个值。可能是因为您每次都添加一个新的侦听器。

所以你的最终代码应该是这样的:

1。你的点击:

@Override 
public void onClick(View view) { 
try{ 
camera.captureImage();  
} 
catch (Exception exception){ 
Toast.makeText(getApplicationContext(),"Please wait",Toast.LENGTH_SHORT).show(); 
} 

} 
});

2。您的听众:

camera.setCameraListener(new CameraListener() { 
@Override 
public void onPictureTaken(byte[] picture) { 
super.onPictureTaken(picture); 
upload_bitmap= BitmapFactory.decodeByteArray(picture, 0, picture.length); 
result = BitmapFactory.decodeByteArray(picture, 0, picture.length); 
captureImage(); 
} 
}); 

3。你的 captureImage(Bitmap bitmap):

保存位图并返回一个uri

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2020-09-25
    • 2017-10-18
    • 2016-04-10
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多