2013-06-04 32 views
8

Tôi muốn sử dụng số NetworkImageView của Volley để tải hình ảnh từ API REST của tôi cần Ủy quyền HTTP cơ bản. Vì vậy, tôi cần phải thêm tiêu đề để yêu cầu HTTP.Android Volley ImageLoader - Cách sử dụng Ủy quyền HTTP cơ bản?

Tôi đã thực hiện lên các phương pháp sau đây:

Override Request.getHeaders() - như mô tả trong this question. Điều này sẽ ổn, nhưng vấn đề là ImageLoadernew ImageRequest() được mã hóa cứng vì vậy tôi không thể chuyển thực hiện Request thành ImageLoader và không thể kế thừa và chỉnh sửa dễ dàng (phương pháp tôi cần phải thực hiện lại sử dụng thuộc tính riêng tư).

Giải pháp là sửa đổi thư viện Volley (những gì tôi muốn tránh).

Sử dụng tùy chỉnh HttpClientStack - như được mô tả here. Sử dụng phương pháp này tôi có thể chặn giao tiếp HTTP và thêm các tiêu đề cần thiết. Nhưng tôi nghĩ rằng đây không phải là cách đúng để làm - Tôi sẽ mất tự động lựa chọn của HttpClient bởi Volley (Gingerbread vs HC và IC).


Có cách nào đơn giản hơn để đạt được điều này mà tôi đang thiếu không?

Trả lời

6

Tôi cũng đã ghi đè số getHeaders(). Cho đến nay tôi đã không tìm thấy một cách để làm điều đó dễ dàng hơn.

Xem ví dụ này https://github.com/njzk2/VolleyTwitter/blob/master/src/com/njzk2/twitterbrowser/TokenRequest.java của yêu cầu được ghi đè Yêu cầu bao gồm tiêu đề Cấp quyền.

Từ mã Volley, tôi không thấy bất kỳ cách nào để thêm tiêu đề tùy chỉnh nếu không bằng cách ghi đè đối tượng Yêu cầu.

Hơn nữa, tôi không thấy nó có thể dễ dàng được thêm như thế nào với cấu trúc của Volley, như đối với Hình ảnh, ImageRequests được tạo bởi ImageLoader.

Nếu tôi sửa đổi Volley để cho phép điều này, tôi sẽ làm cho nó có thể sử dụng một lớp tùy chỉnh mở rộng ImageRequest trong ImageLoader. Lớp ImageRequest ẩn danh trong ImageLoader làm cho nó hơi phức tạp một chút.

+0

Cảm ơn bạn đã trả lời. Thật đáng tiếc là không có cách nào đơn giản hơn. Tôi sẽ làm theo cách bạn đề xuất - bằng cách sửa đổi ImageLoader để sử dụng lớp ImageRequest tùy chỉnh (bằng cách tạo và chuyển đến ImageLoader một ImageRequestFactory). Nếu tôi đúng, những người vô danh chỉ là những Người nghe được chuyển tới ImageRequest, chứ không phải là ImageRequest, vì vậy nó không phải là một vấn đề. – lopisan

+0

có một ImageRequest ẩn danh để gọi onGetImageSuccess (cacheKey, response); trong onResponse (mặc dù tôi đã đặt trực tiếp điều đó vào ImageRequest, hoặc thậm chí trong Yêu cầu.) – njzk2

8

Tôi nghĩ rằng ngăn xếp HTTP là cách để thực hiện. Không có mất lựa chọn HttpClient tự động nếu bạn thực hiện ghi đè dựa trên phiên bản SDK, giống như Volley.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { 
     HurlStack stack = new HurlStack() { 
      @Override 
      public HttpResponse performRequest(Request<?> request, Map<String, String> headers) 
       throws IOException, AuthFailureError { 

       headers.putAll(MyApp.getAuthParams()); 

       return super.performRequest(request, headers); 
      } 
     }; 

     requestQueue = Volley.newRequestQueue(getApplicationContext(), stack); 

    } else { 
     HttpClientStack stack = new HttpClientStack(AndroidHttpClient.newInstance("volley/0")) { 
      @Override 
      public HttpResponse performRequest(Request<?> request, Map<String, String> headers) 
       throws IOException, AuthFailureError { 

       headers.putAll(MyApp.getAuthParams()); 

       return super.performRequest(request, headers); 
      } 
     }; 

     requestQueue = Volley.newRequestQueue(getApplicationContext(), stack); 
    } 

Xem Volley source (dòng 53).

+1

Giải pháp rất gọn gàng. ;) – multiholle

+1

Là một phần của bản phát hành Android M, lớp HttpResponse đã bị xóa khỏi sdk – Bytecode

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