Tôi cần tải hình ảnh cùng với các dữ liệu khác (rất giống với email có đính kèm) đến máy chủ. Tôi cũng cần phải làm điều đó một cách đáng tin cậy để tôi có thể thử lại, vv về thất bại.Tải hình ảnh lên Android lên máy chủ theo cách hiệu quả nhất
Máy chủ là WCF REST server và tôi thực hiện rất nhiều liên lạc khác với nó (JSON) nhưng chỉ có yêu cầu mới này để tải lên hình ảnh.
Vì tôi sử dụng JSON để đăng dữ liệu lên máy chủ của mình - tôi sử dụng GSON trên Android để tuần tự hóa dữ liệu.
Dưới đây là cách tôi đã nhận nó thực hiện cho đến nay (mọi thứ khác hoạt động theo cách này nhưng tôi chỉ mới bắt đầu với hình ảnh)
- tài Lĩnh vực họat động điền (dữ liệu văn bản)
- tài khoản có một số hình ảnh (s) thông qua ý định của máy ảnh. Hiện tại tôi chỉ sử dụng 1 tệp cho hình ảnh
- Tôi chụp ảnh từ SDCard, tải/thay đổi kích thước - phân phối trên ImageView và lưu trữ theo byte []
- Người dùng gửi - Tôi lấy tất cả dữ liệu cùng với hình ảnh từ byte [] và đặt nó vào Java object
- Gọi GSON chuyển đổi và serialize đối tượng
- Lưu đối tượng vào SQLite
- AsyncTask trông trong SQLite cho các hồ sơ, mở ra con trỏ và nhận của văn bản
- AsyncTask tạo HttpConnection và viết dữ liệu văn bản đến máy chủ của tôi.
- THE END
Bây giờ đến vấn đề của tôi .. Rõ ràng trên # 3 - I "nổ" ram với mảng byte của tôi. Đôi khi tôi thậm chí cảm thấy Nexus S của tôi trở nên chậm chạp. Nhưng bằng cách làm điều đó - tôi tránh làm đầy thẻ SD hoặc thư mục ứng dụng với nhiều tệp. Tôi chụp ảnh và lấy nó. Hình ảnh tiếp theo sẽ ghi đè lên hình ảnh trước đó.
BướC# 5 IS chậm. Tôi đã không thử serializer tùy chỉnh trên GSON và thay vì serializing mảng byte thành một cái gì đó như [1, -100,123, -12] tôi có thể nhận được kích thước nhỏ hơn nhiều với Base64 nhưng vẫn còn. Nó sẽ chậm. Và tôi có thể có tối đa 20 hình ảnh ...
BướC# 6 không thành vấn đề. Nhưng với kích thước nhất định (tôi đã thử hình ảnh 300px), tôi bắt đầu gặp lỗi ở bước 7 trên OpenCursor
07-06 20:28:47.113: ERROR/CursorWindow(16292): need to grow: mSize = 1048576, size = 925630, freeSpace() = 402958, numRows = 2
07-06 20:28:47.113: ERROR/CursorWindow(16292): not growing since there are already 2 row(s), max size 1048576
07-06 20:28:47.113: ERROR/Cursor(16292): Failed allocating 925630 bytes for text/blob at 1,1
Vì vậy, toàn bộ điều này không phải là thứ tôi thích. Lý tưởng nhất là tôi muốn tất cả dữ liệu được tải lên trong một phần duy nhất đến máy chủ.
Tôi đã nghĩ có thể lưu trữ hình ảnh được gắn dấu thời gian trên thẻ SD và chỉ lưu trữ tên của họ trong DB. Hơn tôi sẽ xử lý chúng ngay trước khi gửi đến máy chủ. Và khi thành công, tôi sẽ xóa những hình ảnh đó. Loại logic này sẽ làm cho lược đồ SQLite phức tạp hơn nhiều nhưng có lẽ không có cách nào tốt hơn ?!
Tôi đoán tôi đang tìm cách thực hành tốt nhất để xử lý hình ảnh.Làm thế nào để làm followin với tối thiểu sử dụng bộ nhớ/CPU:
- chụp hình
- hiển thị thumbnail
- Resize
- Gửi đến máy chủ
EDIT 1:
Hiện nay Tôi đang nghiên cứu khả năng tải lên toàn bộ shizang dưới dạng tin nhắn MIME nhiều phần. Điều đó sẽ yêu cầu thêm một số JAR vào gói Android của tôi. Ngoài ra tôi không chắc chắn làm thế nào hiệu quả sẽ được mã Apache để tải hình ảnh và gửi chúng (tôi đoán tốt hơn so với mã của tôi) http://okandroidletsgo.wordpress.com/2011/05/30/android-to-wcf-streaming-multi-part-binary-images/
Và tôi sẽ phải đối phó với phân tích tất cả điều này trên WCF bên vì không có cách để làm điều đó với built-on .NET framework.
http://antscode.blogspot.com/2009/11/parsing-multipart-form-data-in-wcf.html
XIN VUI LÒNG CHO TÔI NẾU BẠN ĐÃ XEM NÀY!
EDIT 2:
MIME là không tốt. Không có điểm vì nó serializes nhị phân sử dụng Base64 đó là điều tương tự ..
Vì vậy, bạn đang lưu hình ảnh vào cơ sở dữ liệu? Điều đó sẽ bùng nổ kích thước cơ sở dữ liệu và người dùng của bạn sẽ phàn nàn rằng ứng dụng đang chiếm quá nhiều dung lượng trên bộ nhớ trong của điện thoại và sẽ yêu cầu hỗ trợ app2sd - tại sao không giữ hình ảnh trên thẻ sd? –
@denis Tôi thấy rằng giới hạn kích thước con trỏ trên Android 1MB vì vậy nó không chỉ là vấn đề với bộ nhớ trong mà còn tôi sẽ đạt đến giới hạn đó một cách dễ dàng chỉ bằng cách lưu loại dữ liệu này trong SQLite. Dường như sử dụng bộ nhớ ngoài chỉ là cách chính xác để xử lý các nội dung như vậy – katit