2015-07-17 24 views
15

Tôi đang sử dụng trang bị thêm trong ứng dụng của tôi như thế nàyRetrofit + Okhttp hủy hoạt động không làm việc

final OkHttpClient okHttpClient = new OkHttpClient(); 
okHttpClient.interceptors().add(new YourInterceptor()); 

      final OkClient okClient = new OkClient(okHttpClient); 
      Builder restAdapterBuilder = new RestAdapter.Builder(); 
      restAdapterBuilder.setClient(okClient).setLogLevel(LogLevel.FULL) 
        .setEndpoint("some url"); 
      final RestAdapter restAdapter = restAdapterBuilder.build(); 


public class YourInterceptor implements Interceptor { 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     // TODO Auto-generated method stub 
     Request request = chain.request(); 

     if (request != null) { 
      Request.Builder signedRequestBuilder = request.newBuilder(); 
      signedRequestBuilder.tag("taggiventorequest"); 
      request = signedRequestBuilder.build(); 
      request.tag(); 
     } 
     return chain.proceed(request); 
    } 
} 

sau khi gửi yêu cầu tôi đang kêu gọi

okHttpClient.cancel("taggiventorequest"); 

nhưng yêu cầu không được hủy tôi đang nhận được phản hồi từ trang bị thêm không biết lý do tại sao nó không hủy yêu cầu của tôi

Tôi cần cú volley như hủy bỏ trang bị thêm

+0

Bạn có chắc chắn yêu cầu của mình chưa hoàn tất trước khi bạn hủy cuộc gọi? –

+0

vâng chắc chắn tôi đã nhận được phản hồi sau 2 giây khi nhấp hủy –

+0

@NikolaDespotoski khi tôi có thể mong đợi trang bị thêm phiên bản 2.0? –

Trả lời

2

Vấn đề là yêu cầu được hoàn thành, từ các tài liệu:

http://square.github.io/okhttp/javadoc/com/squareup/okhttp/OkHttpClient.html#cancel-java.lang.Object-

cancel 

OkHttpClient công hủy (Object tag)

Xóa hết lịch trình hoặc cuộc gọi trên máy bay được gắn thẻ bằng thẻ. Yêu cầu đã hoàn tất không thể bị hủy.

+3

yêu cầu không hủy mà vẫn không gửi phản hồi Tôi nhận được phản hồi sau khi nhấp vào nút hủy –

+0

OkHttp yêu cầu không hủy các cuộc gọi đi của tôi. –

6

Retrofit API Spec, yêu cầu hủy sẽ được đưa vào phiên bản 2.0.

cancel() là no-op sau khi nhận được phản hồi. Trong tất cả các trường hợp khác, phương thức sẽ đặt bất kỳ cuộc gọi lại nào thành null (do đó giải phóng các tham chiếu mạnh đến lớp kèm theo nếu được khai báo ẩn danh) và hiển thị đối tượng yêu cầu đã chết . Tất cả các tương tác trong tương lai với yêu cầu đối tượng sẽ ném một ngoại lệ. Nếu yêu cầu đang chờ trong thực thi tương lai của nó sẽ bị hủy bỏ để nó không bao giờ được gọi.

Hiện tại, bạn có thể thực hiện việc này bằng cách tạo lớp gọi lại tùy chỉnh triển khai trên Gọi lại từ trang bị thêm.

public abstract class CancelableCallback<T> implements Callback<T> { 

    private boolean canceled; 
    private T pendingT; 
    private Response pendingResponse; 
    private RetrofitError pendingError; 

    public CancelableCallback() { 
     this.canceled = false; 
    } 

    public void cancel(boolean remove) { 
     canceled = true; 
    } 

    @Override 
    public void success(T t, Response response) { 
     if (canceled) { 
      return; 
     } 
     onSuccess(t, response); 
    } 

    @Override 
    public void failure(RetrofitError error) { 
     if (canceled) { 
      return; 
     } 
     onFailure(error); 
    } 

    protected abstract void onSuccess(T t, Response response); 

    protected abstract void onFailure(RetrofitError error); 
} 

MyApi.java,

private interface MyApi { 
    @GET("/") 
    void getStringList(Callback<List<String>> callback); 
} 

Trong Hoạt động hoặc Fragment,

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setEndpoint(Config.URL) 
      .build(); 
MyApi service = restAdapter.create(MyApi.class); 
CancelableCallback callback = new CancelableCallback<List<String>>() { 
    @Override 
    protected void onSuccess(List<String> stringList, Response response) { 
     for (String str : stringList) { 
      Log.i("Result : ", str); 
     } 
    } 

    @Override 
    protected void onFailure(RetrofitError error) { 
     Log.e("Error : ", error.getMessage() + ""); 
    } 
}; 

service.getStringList(callback); 

Để hủy yêu cầu của bạn, đơn giản gọi

callback.cancel(); 

Đây là một ví dụ đơn giản để hủy từng yêu cầu. Bạn có thể xử lý (hủy, tạm dừng, tiếp tục) hai hoặc nhiều yêu cầu cùng một lúc bằng cách tạo lớp trình quản lý gọi lại. Vui lòng xem that comment để tham khảo.

Hy vọng nó sẽ hữu ích cho bạn.

+0

cảm ơn lời giải thích, nhưng trong trường hợp này, bạn chỉ cần bỏ qua phản hồi khi nhấn hủy. Vì vậy, người thực thi vẫn chạy ở chế độ nền. –

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