2013-09-25 29 views
8

tôi đã tạo thành công Retrofit API Nghỉ ngơi khách hàng làm cho cả hai GET & POST cuộc gọi và cũng kết hợp đó vào Robospice như một dịch vụ nền.Robospice/dịch vụ nền Retrofit truy cập vào cơ sở dữ liệu

Tuy nhiên, tôi muốn dịch vụ Robospice để kết nối với cơ sở dữ liệu và đồng bộ kéo dài các đối tượng lấy từ GET gọi. Sử dụng RetrofitCallback lớp dường như cách rõ ràng nhưng kết nối với cơ sở dữ liệu đòi hỏi Context and I "m lo ngại về rò rỉ các Context.

như vậy, những gì sẽ là phương pháp tốt nhất để có được những RobospiceSpiceService để tồn tại dữ liệu cơ sở dữ liệu cả trước và gửi một yêu cầu đang được xử lý?

Trả lời

2

cuối cùng, như tôi đang Trạm trộn các Nghỉ ngơi dịch vụ API khác nhau gọi để lưu vô tuyến (Reto Meier Dev Bytes: Efficient Data Transfers), tôi gọi các dịch vụ REST API (RetrofitSpiceService s) từ trong bộ điều khiển Robospice SpiceService chứa cả tham chiếu đến số DatabaseHelper (yêu cầu Context) và số gọi lại Retrofit tương ứng cho các dịch vụ Nghỉ ngơi. Bằng cách này, các dịch vụ điều khiển xử lý tất cả các kích hoạt (AlarmManager kích hoạt dịch vụ điều khiển) và kiên trì DB và các dịch vụ còn lại có thể đóng cửa như bình thường mà không có kiến ​​thức của context, database hoặc tương tự.

Đối @ lion789:
Tôi có 4 mô hình đều có một cuộc gọi API tương ứng để đồng bộ hóa với máy chủ (1 POST, 3 GET).
Để xử lý các cuộc gọi đồng bộ, tôi có một IntentService có chứa 4 SpiceManager thuộc tính và 4 RetrofitCallback lớp - một cho mỗi cuộc gọi mô hình/API.
Các IntentService được thông qua một Enum cho biết một chuỗi các API nên được gọi.
IntentService gọi SpiceManager thích hợp chạy, sau đó Callback kích hoạt tính kiên trì và gọi phương thức IntentService để kích hoạt cuộc gọi API tiếp theo theo trình tự.

A lot điều này được trừu tượng hóa và giao tiếp khi tôi sử dụng nó cho mã đăng ký Auth và Push của mình, vì vậy đó là một cơn ác mộng để mô tả nhưng nó vẫn hoạt động khá tốt.

+0

Hey làm bạn có một ví dụ về điều này ... Tôi đang thực sự cố gắng sử dụng Robospice cũng như để bộ nhớ cache dữ liệu với Retrofit – Lion789

+1

Chỉnh sửa câu trả lời của tôi để cung cấp thêm thông tin cho @ Lion789. Hãy cho tôi biết nếu bạn cần thêm thông tin. – saywhatnow

+0

cảm ơn, đã thực sự tò mò, nếu tôi có okHttpClient và trang bị thêm, hiện bộ nhớ đệm xảy ra tự động có nghĩa là tôi không cần phải sử dụng Robospice sau đó? – Lion789

2

Câu hỏi của bạn thực sự mờ với tôi. Tôi không hiểu lý do tại sao bạn không thể sử dụng cơ chế lưu giữ thông thường của RS. Nếu bạn làm như vậy, nó khá dễ dàng để duy trì dữ liệu của bạn khi yêu cầu đã được thực hiện.

Có thể tôi đang thiếu thứ gì đó. Vì vậy, nếu yêu cầu của bạn thực sự là duy trì dữ liệu, thì cách tiếp cận mà bạn đề xuất có vẻ đúng. Bạn có thể tiêm dịch vụ gia vị chính nó bên trong yêu cầu của bạn (xem cách addRequest được ghi đè trong RetrofitSpiceService chẳng hạn).Yêu cầu sau đó sẽ giữ một ngữ cảnh có thể được sử dụng cho sự kiên trì bên trong một cuộc gọi lại hoặc bên trong chính yêu cầu đó.

Gần đây tôi đã mã hóa yêu cầu POST bằng cách sử dụng trang bị thêm và RS. Tôi đã thay đổi chữ ký của yêu cầu POST để trả về một Void. Sau đó, sửa đổi một chút bộ chuyển đổi trang bị thêm để đối phó với trường hợp đó và trả về null. Yêu cầu nhận được dịch vụ gia vị thông qua tiêm như đã đề cập trước đó và có thể thực hiện một số hành động trên cơ sở dữ liệu.

Dưới đây là một số mã để tiêm ứng dụng bên trong yêu cầu từ bên trong dịch vụ gia vị.

@Override 
    public void addRequest(CachedSpiceRequest<?> request, 
        Set<RequestListener<?>> listRequestListener) { 
      if (request.getSpiceRequest() instanceof MySpiceRequest) { 
        MySpiceRequest<?> mySpiceRequest = (MySpiceRequest<?>) request 
            .getSpiceRequest(); 
        mySpiceRequest.setApplication(this.getApplication()); 
      } 
      super.addRequest(request, listRequestListener); 
    } 
Các vấn đề liên quan