Trong phát triển ứng dụng di động, Retrofit là một framework yêu cầu mạng phổ biến, nhưng các bộ chuyển đổi dữ liệu mặc định (như Gson) không thể xử lý trực tiếp dữ liệu theo giao thức JCE (Java Communication Engine) của Tencent. my-tv, một ứng dụng video TV, cần tương tác dữ liệu hiệu quả với máy chủ, và JCE chính là phương thức giao tiếp cốt lõi. Bài viết này sẽ hướng dẫn bạn cách tạo bộ chuyển đổi JCE tùy chỉnh cho Retrofit trong 3 bước đơn giản để giải quyết vấn đề phân tích dữ liệu.
Retrofit mặc định hỗ trợ JSON, XML và các định dạng dữ liệu phổ biến khác, nhưng lại gặp khó khăn khi xử lý các giao thức nhị phân như JCE. Trong dự án my-tv, JCE được sử dụng rộng rãi cho việc truyền dữ liệu, điều này đòi hỏi chúng ta phải triển khai bộ chuyển đổi chuyên dụng để thực hiện:
- Tự động hóa dữ liệu JCE cho yêu cầu
- Phân tích dữ liệu JCE cho phản hồi
- Tích hợp liền mạch với framework Retrofit
Bước 1: Tạo nhà máy bộ chuyển đổi JCE
Nhà máy bộ chuyển đổi là điểm vào để Retrofit nhận diện bộ chuyển đổi tùy chỉnh. Bạn cần kế thừa Converter.Factory và triển khai logic tạo bộ chuyển đổi cho yêu cầu/phản hồi. Trong dự án my-tv, lớp nhà máy này nằm tại app/src/main/java/com/lizongying/mytv/jce/FactoryChuyenDoiJce.java.
public class FactoryChuyenDoiJce extends Converter.Factory {
public static FactoryChuyenDoiJce tao() {
return new FactoryChuyenDoiJce();
}
@Override
public Converter<ResponseBody, ?> chuyenDoiPhanHoi(Type kieuDuLieu, Annotation[] anotations, Retrofit retrofit) {
return new ChuyenDoiPhanHoiJce<>();
}
@Override
public Converter<?, RequestBody> chuyenDoiYeuCau(Type kieuDuLieu, Annotation[] anotationsYeuCau,
Annotation[] anotationsPhuongThuc, Retrofit retrofit) {
return new ChuyenDoiYeuCauJce<>();
}
}
Lớp nhà máy này hoạt động như một "xưởng sản xuất bộ chuyển đổi", khi Retrofit cần xử lý dữ liệu JCE, nó sẽ thông qua lớp này để tạo bộ chuyển đổi tuần tự hóa và phân tích tương ứng.
Bước 2: Triển khai bộ chuyển đổi dữ liệu yêu cầu
Bộ chuyển đổi dữ liệu yêu cầu chịu trách nhiệm chuyển đổi đối tượng Java thành dữ liệu nhị phân định dạng JCE. Trong my-tv, ChuyenDoiYeuCauJce xử lý quá trình này, với phần cốt lõi nằm trong app/src/main/java/com/lizongying/mytv/jce/ChuyenDoiYeuCauJce.java.
Các chức năng chính bao gồm:
- Thiết lập thông tin header (appId, cmdId, ...)
- Sử dụng
JceOutputStreamđể tự động hóa đối tượng - Đóng gói lệnh yêu cầu và xử lý mã hóa
@Override
public RequestBody chuyenDoi(@NonNull T giaTri) {
// 1. Xây dựng header yêu cầu
HeaderYeuCau headerYeuCau = new HeaderYeuCau();
headerYeuCau.appId = "1200013";
headerYeuCau.cmdId = 24897;
// ...thiết lập các thông tin header khác
// 2. Tự động hóa đối tượng JCE
LuongXuatJce luongXuatJce = new LuongXuatJce();
luongXuatJce.setMaNenTangServer("utf-8");
giaTri.vietVao(luongXuatJce);
// 3. Đóng gói lệnh yêu cầu
LenhYeuCau lenhYeuCau = new LenhYeuCau(headerYeuCau, bytes, dauBusiness);
bytes = b.b(lenhYeuCau, headerYeuCau.requestId);
return RequestBody.create(MEDIA_TYPE, bytes);
}
Bước 3: Triển khai bộ chuyển đổi dữ liệu phản hồi
Bộ chuyển đổi dữ liệu phản hồi chịu trách nhiệm chuyển đổi dữ liệu nhị phân JCE thành đối tượng Java. Trong my-tv, ChuyenDoiPhanHoiJce xử lý quá trình này, với mã nguồn tại app/src/main/java/com/lizongying/mytv/jce/ChuyenDoiPhanHoiJce.java.
Các chức năng chính bao gồm:
- Giải mã dữ liệu phản hồi
- Phân tích lệnh phản hồi
- Tạo động lớp mô hình dữ liệu dựa trên cmdId
- Sử dụng
JceInputStreamđể phân tích ngược đối tượng
public T phanTichTu(byte[] duLieuNhan) {
// 1. Giải mã dữ liệu phản hồi
byte[] bArr = b.a(duLieuNhan, iArr);
// 2. Phân tích lệnh phản hồi
LenhPhanHoi lenhPhanHoi = a.g(bArr, LenhPhanHoi.class);
// 3. Tạo động lớp mô hình dữ liệu
QQVideoJCECmd doiTuong = QQVideoJCECmd.doiTuong(lenhPhanHoi.head.cmdId);
JceStruct instance = Class.forName("com.tencent.videolite.android.datamodel.cctvjce." + doiTuong + "Response").newInstance();
// 4. Phân tích ngược
LuongNhapJce luongNhapJce = new LuongNhapJce(lenhPhanHoi.body);
instance.docTu(luongNhapJce);
return (T) instance;
}
Tích hợp vào Retrofit
Hoàn thành 3 bước trên, bạn chỉ cần thêm bộ chuyển đổi tùy chỉnh khi xây dựng Retrofit:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(FactoryChuyenDoiJce.tao())
.build();
Bây giờ, Retrofit có thể tự động xử lý dữ liệu định dạng JCE!