2015-09-11 19 views
5

Tôi đã làm theo hướng dẫn trực tuyến về mã này. và sẽ xuất bản google play với android api 23 Marshmallow.android programming NameValuePair bị xóa cho api 23

private Map<String, String> decodeExtras(String extras) { 
    Map<String, String> results = new HashMap<String, String>(); 
    try { 
     URI rawExtras = new URI("?" + extras); 
     List<NameValuePair> extraList = URLEncodedUtils.parse(rawExtras, "UTF-8"); 
     for (NameValuePair item : extraList) { 
      String name = item.getName(); 
      int i = 0; 
      while (results.containsKey(name)) { 
       name = item.getName() + ++i; 
      } 
      results.put(name, item.getValue()); 
     } 
    } catch (URISyntaxException e) { 
     Log.w(TAG, "Invalid syntax error while decoding extras data from server."); 
    } 
    return results; 
} 

Nhưng NameValuePair và URLEncodedUtils đã bị xóa trong api23 Marshmallow. Làm thế nào tôi có thể thay đổi mã này?

Hãy giúp tôi.

+1

có thể trùng lặp của [Cách sử dụng ứng dụng khách HTTP Apache cũ trên Android M?] (Http://stackoverflow.com/questions/31653002/how-to-use-the-legacy-apache-http- client-on-android-m) –

Trả lời

0

Bạn có thể thêm HttpClient thư viện vào dự án của bạn

2

Sử dụng httpMime.jar gửi dữ liệu đến cơ sở dữ liệu máy chủ.

Tải xuống tệp.jar từ here và dán vào thư mục libs của bạn.

Cách sử dụng:

MultipartEntity multi = new MultipartEntity(); 
multi.addPart("username", new StringBody("Kgandroid")); 
multi.addPart("password", new StringBody("nopass")); 

Đây là một sự thay thế hoàn hảo cho namevaluepairs.

Đối URLEncodedUtils:

đọc this.

Bạn sẽ tìm thấy:

Bản xem trước này loại bỏ hỗ trợ cho máy khách HTTP Apache. Nếu ứng dụng của bạn đang sử dụng ứng dụng khách này và nhắm mục tiêu Android 2.3 (API cấp 9) trở lên, hãy sử dụng lớp HttpURLConnection để thay thế. API này hiệu quả hơn vì nó làm giảm việc sử dụng mạng thông qua nén trong suốt và bộ nhớ đệm phản hồi, và giảm thiểu mức tiêu thụ điện năng.

Vì vậy, bây giờ chúng ta phải sử dụng HttpUrlConnection

Một hướng dẫn đơn giản để sử dụng HttpUrlConnection sẽ được tìm thấy here.

0

Đó không phải là chính xác những gì bạn đang tìm kiếm nhưng nó thực sự gần gũi:

Uri.Builder builder = new Uri.Builder() 
    .query(extras); 
Uri uri = builder.build(); 
Set<String> keys = uri.getQueryParameterNames(); 
Iterator<String> iterator = x.iterator(); 
HashMap<String, List<String>> map = new HashMap<>(); 
while(iterator.hasNext()) { 
     String key = iterator.next(); 
     List<String> values = uri.getQueryParameters(key); 
     map.put(key, values); 
} 

nó tạo ra một Uri từ tham số cựu extras của phương pháp của bạn, giống như phần truy vấn của url của bạn. Khi đó bạn có thể gọi getQueryParameterNames để truy xuất Set các khóa và từ mỗi khóa List<String> đại diện cho mọi giá trị của phần bổ sung đó chứa cho khóa cụ thể đó.

7

Chỉ cần sử dụng Retrofit

HOẶC

Sử dụng HttpURLConnection

HOẶC

Thêm phần này vào build.gradle của bạn (nhưng nó không được đề nghị)

android { 
    useLibrary 'org.apache.http.legacy' 
} 
+1

Đây là câu trả lời hay nhất vì nó liệt kê 3 tùy chọn tốt nhất (theo thứ tự giảm dần của mong muốn không kém). –

2

Dưới đây là tương đương mã sử dụng android.net.Uri cho cấp API 11 (Honeycomb) trở lên. Mã này khá đơn giản, do đó, thực sự không có ý nghĩa khi kéo API của bên thứ ba hoặc API cũ chỉ để tránh vấn đề này.

private Map<String, String> decodeExtras(String extras) { 
    Map<String, String> results = new HashMap<>(); 
    Uri uri = new Uri.Builder().encodedQuery(extras).build(); 
    Set<String> parameterNames = uri.getQueryParameterNames(); 
    for (String parameterName : parameterNames) { 
     List<String> values = uri.getQueryParameters(parameterName); 
     int count = values.size(); 
     if (count >= 1) { 
      results.put(parameterName, values.get(0)); 
      for (int i = 1; i < count; ++i) { 
       results.put(parameterName + i, values.get(i)); 
      } 
     } 
    } 
    return results; 
} 
Các vấn đề liên quan