Android - httpClient 연결 네트워크 에서 데이터 가 져 오기


대부분의 안 드 로 이 드 앱 은 사용
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

좋은 웹페이지 즐겨찾기