Android - httpClient 연결 네트워크 에서 데이터 가 져 오기
8614 단어 Android - 네트워크
대부분의 안 드 로 이 드 앱 은 사용
HttpURLConnection
화해시키다
아파 치 HTTP Client 는 네트워크 데 이 터 를 보 내 고 받 습 니 다 (제3자 오픈 소스 항목 은 포함 되 지 않 음). 이 두 가 지 는 모두 HTTPS, 스 트림 업로드 와 다운 로드 를 지원 합 니 다. 시간 초과, IPv 6 와 연결 풀 을 설정 할 수 있 습 니 다.
1) 아파 치 웹 클 라 이언 트 에 대해:
DefaultHttpClient (android 5.1 \ external \ apache - http \ \ src \ org \ apache \ \ http \ \ impl \ client \ \ \ DefaultHttpClient. java) 와
AndroidHttpClient (android 5.1 \ frameworks \ \ base \ core \ \ java \ \ androidet \ \ http \ \ AndroidHttpClient. java) 는 모두 HttpClient 에 계승 된다.소량의 버그 가 있 음 에 도 불구 하고 방대 하고 유연 한 API 가 있 으 며 비교적 안정 적 이다.그러나 이들 의 호환성 을 파괴 하지 않 는 전제 에서 이들 의 방대 한 API 는 더 나 은 개선 과 향상 을 방해 했다.이 를 위해 Android 팀 은 Apache HTTP Client 를 서서히 포기 하기 시 작 했 습 니 다. Android 6.0 에서 Apache HTTP Client 를 제 거 했 습 니 다. Android 공식 문서 에서 찾 을 수 있 습 니 다.
http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client。
2) HttpURLConnection 에 대하 여:
HttpURLConnection 은 대부분의 경량급 HTTP 클 라 이언 트 에 적용 되 는 일반적인 것 입 니 다.이 종 류 는 초기 버 전에 bug 가 있 을 수 있 지만 집중 하 는 API 로 인해 안정 적 으로 개선 되 기 쉽다.Android 2.2 로 업그레이드 하기 전에,
HttpURLConnection 은 약간 우울 한 오류 가 있 습 니 다. 특히 읽 을 수 있 는 InputStream 에서 close () 를 호출 하면 이 링크 풀 을 해 칠 수 있 습 니 다.연결 풀 을 사용 하지 않 으 려 면:
privatevoid disableConnectionReuseIfNecessary(){ // HTTP connection reuse which was buggy pre-froyo if(Integer.parseInt(Build.VERSION.SDK)
HttpURLConnection ::
(1) Url. openConnection () 을 사용 합 니 다.
새로운 것 을 얻다
HttpURLConnection。
(2) request: request 의 주요 속성 은 url 입 니 다.request header 는 메타 데이터, 예 를 들 어 증빙 (credentials), 첫 번 째 콘 텐 츠 유형 과 session cookies 를 포함 할 수 있 습 니 다.
(3) request 를 선택 적 으로 업로드 하 는 주 체 는 request body 를 포함 할 경우 인 스 턴 스 대상 은 setDoOutput (true) 을 설정 해 야 합 니 다.stream 에 기 록 된 전송 데 이 터 는 getOutputStream 을 통 해 되 돌 아 옵 니 다.
(4) response 를 읽 습 니 다. response 헤 더 는 보통 메타 데 이 터 를 포함 합 니 다. 예 를 들 어
response 주체 내용 유형 과 길이, 수정 날짜 와 session cookies.response 주 체 는 getInputStream 을 통 해 돌아 오 는 stream 에서 읽 을 수 있 습 니 다.response 에 주체 가 없 으 면 이 방법 은 빈 stream 으로 돌아 갑 니 다.
(5) 차단: response 주체 가 읽 히 면 HttpURLConnection 은 disconnect () 를 호출 하여 연결 이 가지 고 있 는 자원 을 방출 해 야 합 니 다., HttpURLConnection :
1) 우선 Manifest 파일 에 네트워크 접근 권한 을 추가 합 니 다.
2) 모 바 일 인터넷 상 태 를 확인 하고 모 바 일 인터넷 이 없 을 수 있 으 며 인터넷 에 연 결 했 을 수 있 으 며 모 바 일 데이터 인지 와 이 파이 인지 구분 해 야 한다.또한 네트워크 연결 에 변화 가 생 겼 을 때 시스템 의 방송 을 받 아야 한다.
android.net.conn.CONNECTIVITY_CHANGE, 그래서 라디오 를 등록 해 야 합 니 다.네트워크 연결 상 태 를 간단하게 하나의 클래스 로 관리 합 니 다.
public class NetConnectMananger { private Context mContext; private ConnectivityManager cm; private NetworkInfo networkInfo; private NetWorkChangedReceiver mNetWorkChangedReceiver; // WIFI private static boolean isWifiConnected = false; // private static boolean isMobileConnected = false; public NetConnectMananger(Context context){ mContext = context; cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); setMobileType(); // mNetWorkChangedReceiver = new NetWorkChangedReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); context.registerReceiver(mNetWorkChangedReceiver, intentFilter); } public boolean isWifiNetWork(){ return isWifiConnected; } public boolean isMobileNetWork(){ return isMobileConnected; } /** * TYPE * */ private void setMobileType(){ networkInfo = cm.getActiveNetworkInfo(); if(networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE){ isMobileConnected = true; }else if(networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI){ isWifiConnected = true; }else{ isWifiConnected = false; isMobileConnected = false; } } /** * * */ public void unRegisterNetWorkChangedReceiver(){ mContext.unregisterReceiver(mNetWorkChangedReceiver); } /** * :android.net.conn.CONNECTIVITY_CHANGE * */ public class NetWorkChangedReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { setMobileType(); } }
3) 비동기 실행 네트워크 작업: 메 인 스 레 드 에서 네트워크 작업 을 수행 하기 때문에 네트워크 작업 이 조금 만 길 면 UI 메 인 스 레 드 ANR 을 초래 할 수 있 습 니 다. 여기 서 Async Task 로 비동기 실행 네트워크 작업 을 수행 합 니 다.
... private static final String url = http://www.weather.com.cn/data/sk/101010100.html; private NetConnectMananger ncm; ... @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_start_http: if(ncm.isMobileNetWork() || ncm.isWifiNetWork()){ new DownLoadTask().execute(url); }else{ Toast.makeText(getApplicationContext(), " !", Toast.LENGTH_LONG).show(); } break; default: break; } } @Override protected void onDestroy() { super.onDestroy(); // ncm 。 ncm.unRegisterNetWorkChangedReceiver(); } private class DownLoadTask extends AsyncTask
{ @Override protected String doInBackground(String... url) { if(url != null){ try { return downLoadData(url[0]); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; } @Override protected void onPostExecute(String result) { mTextView.setText(result); } public String downLoadData(String url) throws IOException{ InputStream stream = null; int len = 500; if(url == null){ Toast.makeText(getApplicationContext(), " !", Toast.LENGTH_LONG).show(); return null; } URL mUrl = new URL(url); HttpURLConnection urlConnection = (HttpURLConnection) mUrl.openConnection(); try{ urlConnection.setReadTimeout(1000); urlConnection.setConnectTimeout(20000); urlConnection.setRequestMethod("GET"); urlConnection.setDoInput(true); urlConnection.connect(); int response = urlConnection.getResponseCode(); Log.i(TAG, "The response is: " + response); stream = urlConnection.getInputStream(); String dataString = getStringFromStream(stream, len); return dataString; }finally{ if(stream != null){ stream.close(); } if(urlConnection != null){ urlConnection.disconnect(); } } } public String getStringFromStream(InputStream in, int len) throws UnsupportedEncodingException, IOException{ Reader reader = null; reader = new InputStreamReader(in, "UTF-8"); char[] buffer = new char[len]; reader.read(buffer); return new String(buffer); } }
참고:
http://developer.android.com/training/basics/network-ops/connecting.html
http://developer.android.com/reference/java/net/HttpURLConnection.html
http://developer.android.com/training/basics/network-ops/managing.html