2011-10-11 30 views
5

Tôi muốn chuyển một chuỗi và một bitmap đến một dịch vụ bằng AIDL. Dịch vụ triển khai phương thức AIDL này:Đặt một bitmap vào một gói

void addButton(in Bundle data); 

Trong trường hợp của tôi, Gói chứa chuỗi và bitmap.

Ứng dụng gọi điện thoại (khách hàng) có mã này:

... 
// Add text to the bundle 
Bundle data = new Bundle(); 
String text = "Some text"; 
data.putString("BundleText", text); 

// Add bitmap to the bundle 
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.myIcon); 
data.putParcelable("BundleIcon", icon); 

try { 
    myService.addButton(data); 

} catch (RemoteException e) { 
    Log.e(TAG, "Exception: ", e); 
    e.printStackTrace(); 
} 
... 

Trên cuối dịch vụ, tôi có một lớp ButtonComponent với mã này:

public final class ButtonComponent implements Parcelable { 
    private final Bundle mData; 

    private ComponComponent(Parcel source) { 
     mData = source.readBundle(); 
    } 

    public String getText() { 
     return mData.getString("BundleText"); 
    } 

    public Bitmap getIcon() { 
     Bitmap icon = (Bitmap) mData.getParcelable("BundleIcon"); 
     return icon; 
    } 

    public void writeToParcel(Parcel aOutParcel, int aFlags) { 
     aOutParcel.writeBundle(mData); 
    } 

    public int describeContents() { 
     return 0; 
    } 
} 

Sau khi tạo một ButtonComponent, Dịch vụ tạo nút sử dụng văn bản và biểu tượng từ đối tượng ButtonComponent:

... 
mInflater.inflate(R.layout.my_button, aParent, true); 
Button button = (Button) aParent.getChildAt(aParent.getChildCount() - 1); 

// Set caption and icon 
String caption = buttonComponent.getText(); 
if (caption != null) { 
    button.setText(caption); 
} 

Bitmap icon = buttonComponent.getIcon(); 
if (icon != null) { 
    BitmapDrawable iconDrawable = new BitmapDrawable(icon); 
    button.setCompoundDrawablesWithIntrinsicBounds(iconDrawable, null, null, null); 
} 
... 

Là kết quả là, nút được hiển thị với văn bản chính xác và tôi có thể thấy không gian cho biểu tượng, nhưng bitmap thực tế không được vẽ (tức là có một khoảng trống ở phía bên trái của văn bản).

Có đúng để đặt một bitmap vào một gói theo cách này không?

Nếu tôi nên sử dụng Bưu kiện (so với gói) có cách nào để duy trì một đối số 'dữ liệu' duy nhất trong phương pháp AIDL để giữ văn bản và biểu tượng cùng nhau không?

Câu hỏi phụ: Làm cách nào để quyết định sử dụng Gói và Bưu kiện?

Rất cám ơn.

Trả lời

2

Đã giải quyết.

Vấn đề là PNG tôi đang sử dụng không được Android hỗ trợ. Mã:

icon.getConfig() 

trả về giá trị rỗng.

3

Đây là câu trả lời cho câu hỏi thứ hai của bạn.

Nguồn: http://www.anddev.org/general-f3/bundle-vs-parcel-vs-message-t517.html

A Bundle là chức năng tương đương với một bản đồ tiêu chuẩn. Lý do chúng tôi không chỉ sử dụng Bản đồ là vì trong ngữ cảnh mà Gói được sử dụng, chỉ những thứ hợp pháp để đưa vào đó là nguyên thủy như Chuỗi, int, v.v. Vì Map API chuẩn cho phép bạn chèn Đối tượng tùy ý, điều này sẽ cho phép nhà phát triển đưa dữ liệu vào Bản đồ mà hệ thống không thể hỗ trợ, điều này sẽ dẫn đến lỗi ứng dụng không trực quan, . Gói đã được tạo để thay thế Bản đồ bằng một hộp chứa an toàn cho phép rõ ràng rằng chỉ có hỗ trợ nguyên thủy.

Bưu kiện tương tự như Gói, nhưng phức tạp hơn và có thể hỗ trợ việc tuần tự hóa các lớp phức tạp hơn. Ứng dụng có thể triển khai giao diện Parcelable để xác định các lớp dành riêng cho ứng dụng có thể được truyền xung quanh, đặc biệt khi sử dụng Dịch vụ. Các kiện hàng có thể tinh vi hơn Gói, nhưng điều này có giá trị chi phí cao hơn đáng kể.

Gói và Bưu kiện là cả hai cơ chế tuần tự hóa dữ liệu và đối với phần đều được sử dụng khi mã ứng dụng chuyển dữ liệu qua các quy trình . Tuy nhiên, vì Parcel có chi phí cao hơn nhiều mà Gói, các gói được sử dụng ở các vị trí phổ biến hơn như phương pháp onCreate , nơi mà chi phí phải ở mức thấp nhất có thể.Bưu kiện là hầu hết các thường được sử dụng để cho phép ứng dụng xác định Dịch vụ với các API hợp lý có thể sử dụng các lớp có ý nghĩa ứng dụng làm đối số phương thức và giá trị trả về. Nếu chúng tôi yêu cầu Nhóm ở đó, điều đó sẽ dẫn đến API thực sự phức tạp. Nói chung, bạn vẫn nên giữ các API dịch vụ càng đơn giản càng tốt, vì các nguyên thủy sẽ tuần tự hóa thêm hiệu quả hơn các lớp có thể tùy chỉnh được.

1

Trong khi gt_ebuddy đưa ra một câu trả lời tốt đẹp, tôi chỉ có một ít mặt lưu ý đến câu hỏi của bạn:

Vấn đề: Bạn đang cố gắng để vượt qua một đối tượng Bitmap vào bộ nhớ, nó có thể là tốt; tuy nhiên, hoàn toàn không tốt khi vượt qua nhiều đối tượng Bitmap như thế này. Thực hành xấu.

Giải pháp của tôi: Hình ảnh đã tồn tại trong resources, hình ảnh này có duy nhất ID; tận dụng nó. Thay vì cố gắng vượt qua rất nhiều số lượng lớn Bitmaps, bạn có thể vượt qua ID bằng cách sử dụng Bundle hoặc Parcel, nhưng Bundle thích hợp hơn cho cấu trúc dữ liệu đơn giản.

+0

Cảm ơn bạn. Trong kịch bản bitmap của tôi là ~ 900 byte, có lẽ là một kích thước hợp lý, và tôi muốn tránh bao gồm tất cả chúng trong APK của dịch vụ (có thể có nhiều khách hàng khác nhau). Nếu tôi sử dụng một ID duy nhất, tôi đoán cả gói của khách hàng và dịch vụ sẽ chứa PNG thực tế ... phải không? – rippeltippel

+0

tất cả các hình ảnh của bạn nên được chứa trong thư mục '/ res/drawable' –

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