2016-02-25 12 views
8

Tôi có bộ điều hợp RecyclerView với nhiều ViewHolders khác nhau. Một trong những ViewHolders chứa một ImageView, mà cần để có thể chụp ảnh, thay đổi kích thước nó, sau đó hiển thị nó. Đối với mô đun, tôi muốn ViewHolder được khép kín: nó không phải là hoạt động phụ huynh nên xử lý tất cả mọi thứ liên quan đến quá trình chụp và hiển thị ảnh. Ngoài ra đường dẫn tập tin là không đổi (nó sẽ không bao giờ thay đổi). Trên thực tế, nó là /storage/emulated/0/com.company.app/myst/cat.jpg. Kết quả là, đây là cách tôi triển khai phương pháp onClick của ImageView.Máy ảnh không ghi đè hình ảnh cũ nếu định hướng thay đổi

@Override 
public void onClick(View v) { 
    final FragmentManager fm = ((MyActivity) getContext()).getSupportFragmentManager(); 
    Fragment auxiliary = new Fragment() { 
     @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      resizeResaveAndDisplayPhoto(); 
      super.onActivityResult(requestCode, resultCode, data); 
      fm.beginTransaction().remove(this).commit(); 
     } 
    }; 
    fm.beginTransaction().add(auxiliary, "FRAGMENT_TAG").commit(); 
    fm.executePendingTransactions(); 

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    if (null != takePictureIntent.resolveActivity(view.getContext().getPackageManager())) { 
     ((MyActivity)view.getContext()).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
     auxFragment.startActivityForResult(takePictureIntent, Constants.REQUEST_CODE_PHOTO); 
    } 
} 

Khi resizeResaveAndDisplayPhoto được gọi là nó thực thi các AsyncTask sau

public static class ResizeThenLoadImageTask extends AsyncTask<String, Void, Bitmap> { 

    private final WeakReference<ImageView> imageViewWeakReference; 
    private final WeakReference<File> fileWeakReference; 
    private final WeakReference<Context> weakContext; 
    private final int reqHeight; 
    private final int reqWidth; 

    public ResizeThenLoadImageTask(Context context, ImageView imageView, File file, int reqHeight, int reqWidth) { 
     weakContext = new WeakReference<Context>(context); 
     imageViewWeakReference = new WeakReference<>(imageView); 
     fileWeakReference = new WeakReference(file); 
     this.reqHeight = reqHeight; 
     this.reqWidth = reqWidth; 
    } 

    @Override 
    public Bitmap doInBackground(String... params) { 
     File file = fileWeakReference.get(); 
     Bitmap bitmap = null; 
     if (null != file) { 
      bitmap = ImageUtils.reduceImageSize(file, reqHeight, reqWidth); 
      ImageUtils.saveBitmapToGivenFile(bitmap, file); 
     } 
     return bitmap; 
    } 

    @Override 
    public void onPostExecute(Bitmap bitmap) { 
     if (null != imageViewWeakReference && null != fileWeakReference) { 
      ImageView imageView = imageViewWeakReference.get(); 
      File file = fileWeakReference.get(); 
      if (null != imageView) { 
       if (null != bitmap) { 
        imageView.setImageBitmap(bitmap); 
       } 
       else { 
        imageView.setImageResource(R.drawable.photo); 
       } 
       imageView.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         if (null != weakContext.get()) { 
          ((MyActivity) weakContext.get()).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
         } 
        } 
       }, 10000); 
      } 
     } 
    } 
} 

Bạn có thể nhận thấy rằng tôi khóa định hướng trước khi chụp ảnh và mở khóa 10 giây sau khi hiển thị ảnh. Bí quyết đó là một phần trong quá trình khắc phục sự cố của tôi. Vì vậy, đây là tình hình. Hệ thống được mô tả ở trên hoạt động rất tốt. Sự cố xảy ra trong trường hợp sau

  • Giả sử tôi đã có ảnh trong ImageView nhưng muốn thay thế.
  • Vì vậy, tôi nhấp vào ImageView để chụp ảnh mới.
  • Nếu tôi xoay thiết bị để chụp ảnh mới, khi tôi trả lại ảnh mới hiển thị ngay trước khi ảnh cũ trở về.
  • Vì vậy, tôi khóa theo hướng để xem điều gì đang xảy ra. Đây là những gì tôi tìm thấy.
  • Ảnh mới hiển thị miễn là tôi khóa hướng. Ngay sau khi định hướng mở ra (10 giây), ảnh cũ sẽ trả lại.
  • Nếu tôi rời khỏi hoạt động và trả lại, ảnh cũ vẫn hiển thị.
  • Nếu tôi đóng hoàn toàn ứng dụng và sau đó quay lại, sau đó tôi sẽ thấy ảnh mới.
+0

Vì vậy, tôi sử dụng một phần ba số điểm để đặt câu hỏi này. Xin vui lòng, đưa ra câu trả lời có ý nghĩa. –

+0

bạn có đang gặp vấn đề này chỉ trên định hướng hay chỉ hình ảnh mặc định được hiển thị mọi lúc? –

+0

Hiển thị cho chúng tôi mã khi 'Hoạt động' được tạo hoặc tạo lại lần đầu trên sự thay đổi hướng, nơi bạn tải bitmap từ tệp vào' ImageView'. –

Trả lời

0

Khi xoay thiết bị, hoạt động đang chạy được tạo lại cũng như asyncTask gắn vào nó, có thể gây rò rỉ.

Có thể bạn cần gọi asyncTask bên trong dịch vụ thay vì trong một hoạt động để asyncTask sẽ được gắn vào vòng đời của dịch vụ.

+0

Câu trả lời của bạn bị mất điểm. Nó không giải thích tại sao nội dung tập tin lại quay trở lại bức ảnh trước đó. Xin vui lòng đọc toàn bộ câu hỏi. –

+0

ngôn ngữ trước đó quá khó hiểu. Vì vậy, tôi đã chỉnh sửa văn bản. –

+0

Tôi không chắc chắn nếu câu trả lời của tôi giải quyết được vấn đề của bạn, phải không? Nếu có, tôi sẽ chỉnh sửa câu trả lời của mình để giải thích lý do nội dung tệp quay lại ảnh trước đó, nếu không, sẽ không có ý nghĩa để giải thích. – cherif

Các vấn đề liên quan