Tạo bộ chuyển đổi tùy chỉnh cho Retrofit trong 3 bước để xử lý dữ liệu JCE

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!

Thẻ: Retrofit JCE Android Java Chuyển đổi dữ liệu

Đăng vào ngày 9 tháng 7 lúc 18:09