繁体   English   中英

android编程NameValuePair已移除api 23

[英]android programming NameValuePair removed for api 23

我一直在关注此代码的在线教程。 并将发布google play with android api 23 Marshmallow。

 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;
}

但是在api23 Marshmallow中删除了NameValuePair和URLEncodedUtils。 我该如何更改此代码?

请帮我。

只需使用Retrofit

要么

使用HttpURLConnection

要么

将其添加到build.gradle (但不建议)

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

使用httpMime.jar将数据发送到服务器数据库。

这里下载.jar并将其粘贴到libs文件夹中。

用法:

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

这是namevaluepairs的完美替代品。

对于URLEncodedUtils:

这个

你会找到:

此预览删除了对Apache HTTP客户端的支持。 如果您的应用使用此客户端并定位到Android 2.3(API级别9)或更高版本,请改用HttpURLConnection类。 此API更高效,因为它通过透明压缩和响应缓存减少了网络使用,并最大限度地降低了功耗。

所以现在我们必须使用HttpUrlConnection

这里将提供使用HttpUrlConnection的简单教程。

这是使用android.net.Uri进行API级别11(Honeycomb)及以上的等效代码。 这段代码非常简单,因此仅仅为了避免这一问题,引入第三方API或旧版API实际上没有意义。

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;
}

您可以手动将HttpClient库添加到项目中

这不是你想要的,但它非常接近:

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);
}

它从您方法的前参数extras创建一个Uri ,看起来像您的url的查询部分。 之后,您可以调用getQueryParameterNames来检索一Set键,并从每个键中检索一个List<String> ,它表示该特定键所包含的附加项的每个值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM