2015-03-28 24 views
8

Gần đây tôi đã bắt đầu phát triển một ứng dụng Android và quyết định sử dụng Retrofit làm khách hàng của dịch vụ REST, nhưng tôi không chắc liệu cách tiếp cận của tôi có tốt hay không:Trang bị thêm cuộc gọi bên trong AsyncTask

i. Tôi đã thực hiện một cuộc gọi không đồng bộ đến api của tôi, được gọi bên trong phương thức doInBackground của AsyncTask. Các mối quan tâm : đọc this article khiến tôi bối rối. AsyncTask có phù hợp với loại nhiệm vụ này không? Tôi có nên gọi API trực tiếp từ Hoạt động không? Tôi hiểu rằng các phương thức gọi lại của Retrofit được thực hiện trên luồng giao diện người dùng, nhưng làm thế nào về cuộc gọi qua HTTP? Retrofit có tạo chủ đề cho điều đó không?

ii. Tôi muốn các AuthenticationResponse được lưu bên trong một đối tượng SharedPreferences, mà dường như không có sẵn bên trong phương thức thành công của cuộc gọi lại. Bất kỳ đề xuất/thực hành tốt?

Cảm ơn bạn trước :)

Dưới đây là doInBackGroundMethod tôi:

@Override 
    protected String doInBackground(String... params) { 
     Log.d(LOCATION_LOGIN_TASK_TAG, params[0]); 

     LocationApi.getInstance().auth(new AuthenticationRequest(params[0]), new Callback<AuthenticationResponse>() { 

      @Override 
      public void success(AuthenticationResponse authenticationResponse, Response response) { 
       Log.i("LOCATION_LOGIN_SUCCESS", "Successfully logged user into LocationAPI"); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Log.e("LOCATION_LOGIN_ERROR", "Error while authenticating user in the LocationAPI", error); 
      } 
     }); 
     return null; 
    } 

Trả lời

27

I. Retrofit hỗ trợ ba cách để tạo ra một yêu cầu:

  • đồng bộ

Bạn phải khai báo phương thức trả về đáp ứng dưới dạng giá trị cho ví dụ phong phú:

@GET("/your_endpoint") 
    AuthenticationResponse auth(@Body AuthenticationRequest authRequest); 

Phương pháp này được thực hiện trong chuỗi được gọi. Vì vậy, bạn không thể gọi nó trong chủ đề chính/UI.

  • không đồng bộ

Bạn phải khai báo khoảng trống phương pháp, trong đó có gọi lại với phản ứng như param cuối cùng ví dụ:

@GET("/your_endpoint") 
    voud auth(@Body AuthenticationRequest authRequest, Callback<AuthenticationResponse> callback); 

Việc thực hiện yêu cầu được gọi là trong chủ đề nền mới, và các phương thức gọi lại được thực hiện trong chuỗi mà phương thức được gọi. Vì vậy, bạn có thể gọi phương thức này trong chủ đề chính/UI mà không có chủ đề mới/AsyncTask.

  • Sử dụng RxAndroid

Cách cuối cùng mà tôi biết là phương pháp trong đó sử dụng RxAndroid. Bạn phải khai báo phương thức trả về đáp ứng như quan sát được với giá trị. Ví dụ:

@GET("/your_endpoint") 
    Observable<AuthenticationResponse> auth(@Body AuthenticationRequest authRequest); 

Phương pháp này cũng hỗ trợ yêu cầu mạng trong chuỗi mới. Vì vậy, bạn không phải tạo chủ đề mới/AsyncTask. Gọi lại Action1 từ phương thức đăng ký được gọi trong giao diện người dùng/chủ đề chính.

II. Bạn có thể gọi phương thức của mình ngay trong Hoạt động và bạn có thể ghi dữ liệu của mình vào SharedPreferences như được hiển thị bên dưới:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 
sharedPreferences.edit() 
      .put...//put your data from AuthenticationResponse 
        //object which is passed as params in callback method. 
      .apply(); 
+0

Cảm ơn câu trả lời của bạn Konrad. Tôi không chắc Retrofit đang làm gì sau hậu trường.Lúc đầu, tôi đã thực hiện cuộc gọi mạng trong AsyncTask, đó là một chút quá mức cần thiết và khó truy cập vào cá thể SharedPreferences. Câu trả lời rất hay và thông tin – user3159152

+0

Chào mừng tôi rất vui vì tôi có thể giúp bạn. Nếu nó là hữu ích cho bạn hãy chấp nhận nó. Chỉ cần đánh dấu hộp kiểm –

+0

giải thích rất tốt. – Andrain

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