2016-06-02 2 views
-2

Поскольку org.appache устарел в Android 5.1.1, и они предлагают использовать HttpUrlConnection.Как изменить этот HTTP-запрос на HttpUrlConnection

Не могли бы вы помочь мне изменить мой код этого, с допустимой команды HttUrlConnection (им новое в Android)

package com.example.cbmedandroid; 
import java.io.IOException; 
import java.io.InputStream; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.protocol.BasicHttpContext; 
import org.apache.http.protocol.HttpContext; 
import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
public class MainActivity extends Activity implements OnClickListener { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    findViewById(R.id.my_button).setOnClickListener(this); 
} 

@Override 
public void onClick(View arg0) { 
    Button b = (Button)findViewById(R.id.my_button); 
    b.setClickable(false); 
    new LongRunningGetIO().execute(); 
} 

private class LongRunningGetIO extends AsyncTask <Void, Void, String> { 
    protected String getASCIIContentFromEntity(HttpEntity entity) throws IllegalStateException, IOException { 
     InputStream in = entity.getContent(); 
     StringBuffer out = new StringBuffer(); 
     int n = 1; 
     while (n>0) { 
      byte[] b = new byte[4096]; 
      n = in.read(b); 
      if (n>0) out.append(new String(b, 0, n)); 
     } 
     return out.toString(); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpContext localContext = new BasicHttpContext(); 
     HttpGet httpGet = new HttpGet("http://192.168.43.13:8000/api/horaire.json"); 
     String text = null; 
     try { 
      HttpResponse response = httpClient.execute(httpGet, localContext); 
      HttpEntity entity = response.getEntity(); 
      text = getASCIIContentFromEntity(entity); 
     } catch (Exception e) { 
      return e.getLocalizedMessage(); 
     } 
     return text; 
    } 

    protected void onPostExecute(String results) { 
     if (results!=null) { 
      EditText et = (EditText)findViewById(R.id.my_edit); 
      et.setText(results); 
     } 
     Button b = (Button)findViewById(R.id.my_button); 
     b.setClickable(true); 
    } 
} 
} 

Благодаря

Кроме того, getASCIIContentFromEntity (HttpEntity сущность), как представляется, не рекомендуется к!

EDIT: Это то, что я изменил в своем коде.

protected String doInBackground(Void... params) { 
     URL url; 
     HttpURLConnection urlConnection = null; 
     try { 
      url = new URL("http://192.168.43.13:8000/api/horaire.json"); 

      urlConnection = (HttpURLConnection) url.openConnection(); 

      InputStream in = urlConnection.getInputStream(); 

      InputStreamReader isw = new InputStreamReader(in); 

      int data = isw.read(); 
      while (data != -1) { 
       char current = (char) data; 
       data = isw.read(); 
       System.out.print(current); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
     } 
    } 

Но как насчет метода «LongRunningGetIO extends AsyncTask»?

+0

Что вы уже пробовали? Существует много примеров использования 'HttUrlConnection' – Selvin

+0

. Я изменил свой запрос на подключение к http, im не уверен, что он прав, но я не знаю, как изменить метод getASCIIContentFromEntity (HttpEntity). –

+0

, не возвращая строку из символов, которые вы читаете, 'isw.read()' замедляет процесс, потому что вы читаете символ по символу. Используйте метод read (char []) с достаточно большим буфером, чтобы исправить это. – zapl

ответ

0

запрос HttpGet без установки ничего (как Accept: application/json заголовка, выбрав кодировку, ...) должно быть достаточно равнозначным:

@Override 
protected String doInBackground(Void... params) { 
    return get("http://192.168.43.13:8000/api/horaire.json"); 
} 

private String get(String urlString) { 
    try { 
     HttpURLConnection urlConnection = (HttpURLConnection) new URL(urlString).openConnection(); 
     Reader reader = new InputStreamReader(urlConnection.getInputStream()); 
     try { 
      StringWriter writer = new StringWriter(); 
      char[] cbuf = new char[8192]; 
      int read; 
      while ((read = reader.read(cbuf)) != -1) { 
       writer.write(cbuf, 0, read); 
      } 
      return writer.toString(); 
     } finally { 
      reader.close(); 
     } 
    } catch (Exception e) { 
     return e.getMessage(); 
    } 
} 
+0

Хорошо Спасибо, но как насчет метода LongRunningGetIO? мне нужно что-то изменить? –

+0

@ KaneSamba no. 'LongRunningGetIO' и' 'String doInBackground (Void ... params)' метод ведет себя так, как раньше. – zapl

0

Try This

@Override 
protected String doInBackground(Void... params) { 
StringBuffer response_string = new StringBuffer(); 
    try { 
     URL obj = new URL(url); 
     HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
     con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
     con.setRequestMethod("POST"); 

     OutputStream os = con.getOutputStream(); 
     os.write(params.toString().getBytes("UTF-8")); 
     os.close(); 



     int responseCode = con.getResponseCode(); 

     System.out.println("PostParseURL "+url); 
     System.out.println("PostParseCODE " + responseCode); 

     if (responseCode == HttpURLConnection.HTTP_OK) { 
      BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
      String inputLine; 
      while ((inputLine = in.readLine()) != null) { 
       response_string.append(inputLine); 
      } 
      in.close(); 
     } 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
return response_string.toString(); 
} 

да и нет необходимости getASCIIContentFromEntity метода и здесь PARAMS является Вашим JSONObject запросом

+0

Хорошо спасибо, я попробую это –

Смежные вопросы