【问题标题】:NameValuePair deprecatedNameValuePair 已弃用
【发布时间】:2015-03-23 21:27:58
【问题描述】:

因为 Android 22 NameValuePair 已被弃用。

documentation 发送给我一篇关于 openConnection 的文章,但我就是这样做的。那么如何正确替换呢?

我知道我仍然可以使用它,并且必须构建一个字符串,只是弄清楚如何在方法之间传递数据。

【问题讨论】:

  • 我认为这是来自 Google 方面的文档错误。因为重定向目的地与目的不符:|
  • 我对Android一无所知,但这里似乎有两个问题。您是在谈论以某种方式替换 NameValuePair (以什么方式?您如何使用它?)?或者您正在寻找一种发出 HTTP 请求的方法?请在不使答案无效的情况下澄清您的问题。
  • 你为什么要为你不知道的旧物品烦恼?是的,替换就是这种情况,因为它已被弃用。

标签: android httpurlconnection


【解决方案1】:

您可以使用 ContentValues 代替 NameValuePair 列表。

创作:

ContentValues values = new ContentValues();
values.put("key1", "value1");
values.put("key2", 123);

用法:

for (Map.Entry<String, Object> entry : values.valueSet()) {
    String key = entry.getKey();
    String value = entry.getValue().toString();
}

【讨论】:

  • 这只是 HashMap&lt;String, Object&gt; 的包装器以保存实际值。不妨按照其他答案中的建议使用它...
  • 当你创建一个像 new UrlEncodedFormEntity(values, HTTP.UTF_8); 这样的 http 连接时会怎样?它需要一个 NameValuePair,而不是 ContentValues
  • @Dantalian UrlEncodedFormEntity 与 NameValuePair 一起是 apache 包的一部分。整个包装现在已弃用,您不应该使用它。
  • 为什么 android 会弃用所有很酷的东西?开个玩笑,我将重新实现我已弃用的​​代码并愉快地获得收益!
【解决方案2】:

你可以用一个

HashMap<String,Object>

并传递 HashMap b/w 方法。

【讨论】:

    【解决方案3】:

    试试这个代码,我在我的应用程序和作品中使用

     
    public String post(JSONObject object) throws Exception {
    
        HttpURLConnection conexao = null;
    
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) {
    
            System.setProperty("http.keepAlive", "false");
        }
    
        try {
    
            URL url = new URL(URL_WEB_SERVICE_POST);
    
            conexao = (HttpURLConnection) url.openConnection();
            conexao.setConnectTimeout(20000);
            conexao.setReadTimeout(15000);
            conexao.setRequestMethod("POST");
            conexao.setDoInput(true);
            conexao.setDoOutput(true);
    
            Uri.Builder builder = new Uri.Builder()
                    .appendQueryParameter("parametros", object.toString());
    
            String query = builder.build().getEncodedQuery();
    
            conexao.setFixedLengthStreamingMode(query.getBytes().length);
    
            OutputStream os = conexao.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
    
            writer.write(query);
            writer.flush();
            writer.close();
            os.close();
    
            conexao.connect();
    
            int responseCode = conexao.getResponseCode();
    
            Log.v(Debug.TAG + " reponseCode", String.valueOf(responseCode));
    
            if(responseCode == HttpURLConnection.HTTP_OK){
    
                StringBuilder sb = new StringBuilder();
                try{
    
                    BufferedReader br = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
                    String linha;
    
                    while ((linha = br.readLine())!= null){
    
                        sb.append(linha);
                    }
    
                    return sb.toString();
                }catch (Exception e){
    
                    e.printStackTrace();
                }
    
            }else{
    
                if(responseCode == HttpURLConnection.HTTP_CLIENT_TIMEOUT){
    
                    throw new Exception("Tempo maximo na comunição atingido: "+ conexao.getErrorStream());
                }
            }
    
        } catch (MalformedURLException e) {
    
            e.printStackTrace();
        } catch (IOException e) {
    
            e.printStackTrace();
            throw new Exception("Falha de comunicação, verifique sua conexão com a internet");
        }finally {
    
            conexao.disconnect();
        }
    
        return null;
    }
    

    【讨论】:

    • 我的应用不在 Play 上,很遗憾我需要支持旧设备。公司中很多用户仍然使用旧设备。
    【解决方案4】:

    我建议使用 Volley,这是一个 HTTP 库,它可以让 Android 应用的网络更轻松,最重要的是,更快。

    【讨论】:

      【解决方案5】:

      如果您不想将 Apache 库用作旧版,请使用 Java HttpUrlConnectionMap/Hashmap

      /**
       *
       * @param postUrl
       * @param postParams
       * @return response in string
       */
      public static String makeServiceCall(final String postUrl, final Map<String, String> postParams) {
          Log.e("URL#",postUrl);
          StringBuilder responseBuilder  = new StringBuilder();
          HttpURLConnection conn = null;
          try {
              final URL mUrl = new URL(postUrl);
              conn = (HttpURLConnection) mUrl.openConnection();
              conn.setDoInput(true);
              conn.setDoOutput(true);
              conn.setRequestMethod("POST");
              conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
              conn.setRequestProperty("charset", "utf-8");
              conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7");
              conn.connect();
              conn.setReadTimeout(180000);
              conn.setConnectTimeout(180000);
              final OutputStream os = conn.getOutputStream();
              BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
              writer.write(getQuery(postParams));
              writer.flush();
              writer.close();
              os.close();
              final int responseCode = conn.getResponseCode();
              if (responseCode == HttpsURLConnection.HTTP_OK) {
                  String line;
                  BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                  while ((line = br.readLine()) != null) {
                      responseBuilder.append(line);
                  }
              } else {
                  responseBuilder.append("");
              }
          } catch (MalformedURLException e) {
              e.printStackTrace();
              responseBuilder.append(e.getMessage());
              return responseBuilder.toString();
          } catch (IOException e) {
              e.printStackTrace();
              responseBuilder.append(e.getMessage());
              return responseBuilder.toString();
          } finally {
              if (null != conn) {
                  conn.disconnect();
              }
          }
          System.gc();
          return responseBuilder.toString();
      }
      
      
      /**
       * @Param: map , takes in value in key val format
       */
      private static String getQuery(final Map<String, String> mPostItems) throws UnsupportedEncodingException {
          final StringBuilder result = new StringBuilder();
          boolean first = true;
          final Set<String> mKeys = mPostItems.keySet();
          for (String key : mKeys) {
              if (first)
                  first = false;
              else
                  result.append("&");
      
              result.append(URLEncoder.encode(key, "UTF-8"));
              result.append("=");
              result.append(URLEncoder.encode(mPostItems.get(key), "UTF-8"));
              Log.e("Key#",key+"#"+mPostItems.get(key));
          }
          return result.toString();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        相关资源
        最近更新 更多