2011-11-10 33 views
11

Có số bitmap, vì vậy tôi muốn tải lên chuỗi webserivceas và muốn truy xuất lại chuỗi.Hết bộ nhớ khi phân bổ byte (Bitmap dưới dạng Chuỗi tới webservice bằng xà phòng)

Để chuyển đổi định dạng bitmap lên chuỗi đang sử dụng:

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
byte[] byteArray = stream.toByteArray(); 

strBase64 = Base64.encodeToString(byteArray, Base64.URL_SAFE); 

này trên String được sử dụng như tài sản để trong soapobject để tải lên.

Nhưng tôi đang nhận được Out of memory on a 11674900-byte allocation, trong khi in và tải lên.

Và nếu tôi sửa lỗi vấn đề này, không in đang nhận

com.sun.jdi.InvocationException occurred invoking method. 

trên soaprequest.

Làm thế nào để giải quyết vấn đề này và để upload image đến webservice như chuỗi?

Trả lời

9

Bạn đang tạo 3 bản sao của hình ảnh 11MB (bitmap, stream, strBase64). Vì vậy, giảm sử dụng bộ nhớ bằng cách gọi

bitmap.recycle(); 

bên dưới dòng này:

bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 

Cũng đóng dòng khi bạn đang thực hiện với nó (sau đây stream.toByteArray();):

stream.close(); 
stream = null; 

Hãy nhớ rằng không đảm bảo rằng bộ nhớ sẽ được làm sạch ngay lập tức sau các cuộc gọi này. Cách thích hợp để xử lý loại tình huống này là chuyển các tệp lớn thành từng đoạn.

+0

nó được giải quyết bằng mảng byte và đã sử dụng tuần tự hóa trước khi yêu cầu xà phòng. – Udaykiran

+0

@ Udayakiran, tôi gặp lỗi tương tự, những gì bạn đã đề cập trong câu hỏi.Xin vui lòng cho biết cách bạn khắc phục vấn đề này. –

0

Phân bổ 11 triệu byte lớn hơn nhiều so với hầu hết các vùng điện thoại có thể xử lý. bạn chắc chắn không muốn giữ một mảng byte có kích thước đó trong bộ nhớ.

Hãy thử sử dụng kích thước insample với

BitmapFactory.decodeStream (InputStream là, Rect outPadding, BitmapFactory.Options opts)

và tùy chọn cài đặt để sử dụng kích thước insample để trả lại một hình ảnh kích thước hợp lý.

+0

Bạn đang nói rằng lưu trữ 11mb dữ liệu trong bộ nhớ là không thể trên điện thoại Android? –

+0

Nó có thể là có thể, nhưng một trong hai điện thoại của bạn không có nhiều bộ nhớ miễn phí còn lại hoặc nó không thể deallocate bộ nhớ nhanh như bạn đang phân bổ nó. –

-1

Sửa chữa đơn giản cho một số có thể là thêm android: configChanges = "orientation | screenSize" vào tệp kê khai của bạn. Trong trường hợp của tôi, bộ mô phỏng Nexus_S đã bị lỗi mà không có dòng này, trong khi thiết bị Nexus 7 thực tế tôi đang thử nghiệm không bị rơi khi xoay vòng.

Thêm tùy chọn này có vẻ là một bản sửa lỗi dễ dàng cho các ứng dụng có một vài bitmap "match_parent" lớn để xoay và thay đổi kích thước.

Cẩn thận nếu bạn đang xây dựng API trước 13!

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