2015-04-01 6 views
11

Używam w mojej aplikacji i kilka innych klas, takich jak HttpStatus, SSLSocketFactory, PlainSocketFactory, SchemeRegistry, itp. Ale od API 22 wszystkie są oznaczone jako przestarzałe i nie widzę wyraźnego wskazania jako do tego, co je zastąpiło. Dokumentacja jasna mówi: "Użyj zamiast tego openConnection(). Odwiedź stronę this webpage w celu uzyskania dalszych szczegółów", co nie wyjaśnia, co należy zrobić. openConnection() wskazuje tylko na klasę URL, a link do strony pochodzi z 2011 roku, który mówi o różnicach między klasami Apache a HttpUtrlConnection. Czy to oznacza, że ​​od teraz powinniśmy używać klasy HttpUrlConnection? A jeśli tak jest, myślałem, że to nie jest bezpieczne dla wątków (dlatego użyłem ThreadSafeClientConnManager).W Androidzie, dlaczego wszystkie klasy org.apache.http. * Są przestarzałe w API 22 (i co powinienem użyć jako zamienniki)?

Czy ktoś mógłby mi to wyjaśnić?

+0

Sprawdź moją odpowiedź [tutaj] (http://stackoverflow.com/a/32202597/2590478). – MidasLefko

+0

Nadal można korzystać z bibliotek Apache. Sprawdź tę odpowiedź: http://stackoverflow.com/a/37623038/1727132 – Jehy

+0

Ponieważ istnieje alternatywna klasa HttpURLConnection, która zmniejsza zużycie sieci i zużycie energii. Źródło: https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client –

Odpowiedz

5

Zapytałem o coś około that około pół miesiąca temu. Jak się okazuje, musimy używać tylko metody openConnection() zamiast starych.

Myślę, że jest trochę za wcześnie, aby zmienić kod, ponieważ Lollipop jest na kilku smartfonach, ale powinieneś go zmienić, abyś mógł wyprzedzić czas. Mam całkiem dobry pomysł, stąd jak połączenie Using java.net.URLConnection to fire and handle HTTP requests? a także spróbować wyszukać „HttpURLConnection przykład”

także o bezpieczeństwo wątku this, nadzieję, że to pomaga

(starałem się pisać je jako komentarz, ale nie mam wystarczającej reputacji)

+0

Zbiorniki dla postu, ale już wiem, jak korzystać z HttpUrlConnection. Potrzebuję tylko kogoś, kto potwierdzi, że w sposób oczywisty ma zastąpić HttpClient i co zrobić z bezpieczeństwem wątków. Twój link potwierdził, że nie jest bezpieczny dla wątków, ale nie widzę niczego, co pokazuje, jak używać go w środowisku z wątkami, gdy chcę nawiązywać współbieżne połączenia. – user496854

2

użyć tej HttpURLConnection jako alternatywnego

public String performPostCall(String requestURL, 
      HashMap<String, String> postDataParams) { 

     URL url; 
     String response = ""; 
     try { 
      url = new URL(requestURL); 

      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.setReadTimeout(15000); 
      conn.setConnectTimeout(15000); 
      conn.setRequestMethod("POST"); 
      conn.setDoInput(true); 
      conn.setDoOutput(true); 


      OutputStream os = conn.getOutputStream(); 
      BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(os, "UTF-8")); 
      writer.write(getPostData(postDataParams)); 

      writer.flush(); 
      writer.close(); 
      os.close(); 
      int responseCode=conn.getResponseCode(); 

      if (responseCode == HttpsURLConnection.HTTP_OK) { 
       String line; 
       BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream())); 
       while ((line=br.readLine()) != null) { 
        response+=line; 
       } 
      } 
      else { 
       response=""; 

       throw new HttpException(responseCode+""); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return response; 
    } 

....

private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException{ 
     StringBuilder result = new StringBuilder(); 
     boolean first = true; 
     for(Map.Entry<String, String> entry : params.entrySet()){ 
      if (first) 
       first = false; 
      else 
       result.append("&"); 

      result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); 
      result.append("="); 
      result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); 
     } 

     return result.toString(); 
    } 

source

+0

Dzięki za szczegółowy post, ale już wiem, jak korzystać z HttpUrlConnection. Chciałem się dowiedzieć, czy właśnie tego powinniśmy teraz użyć (ponieważ dokumenty API są bardzo niejasne) i to, co powinniśmy zrobić, nie jest bezpieczne dla wątków. Co mamy użyć zamiast ThreadSafeClientConnManager? – user496854

+0

Przeczytaj to: http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html –

Powiązane problemy