안드로이드 애플리케이션 개발 - 네트워크 프로그래밍

5769 단어

네트워크 이미지 뷰어

  • 이미지 주소 지정
  • http 요청 발송
    URL url = new URL(address);
    // , 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    // , 
    conn.setRequestMethod("GET");
    // 
    conn.setConnectTimeout(5000);
    conn.setReadTimeout(5000);
    // , 
    conn.connect();
    // 200, 
    if(conn.getResponseCode() == 200){
    
    }
  • 서버의 그림은 흐르는 형식으로 브라우저에 되돌아온다
    // 
    InputStream is = conn.getInputStream();
    // , 
    Bitmap bm = BitmapFactory.decodeStream(is);
  • 비트맵 객체를 ImageView
    ImageView iv = (ImageView) findViewById(R.id.iv);
    iv.setImageBitmap(bm);
    에 표시
  • 권한 추가
    <uses-permission android:name="android.permission.INTERNET"/>
  • 네트워크 요청


    주 스레드 차단

  • 마스터 스레드는 UI 스레드라고도 합니다. 마스터 스레드에서만 UI를 새로 고칠 수 있기 때문입니다.하위 스레드에서 UI를 새로 고쳐야 하는 경우 메시지 대기열 메커니즘
  • 을 사용합니다.
  • 안드로이드에서 메인 스레드가 막히면 UI 리셋이 중단되고 응용 프로그램이 사용자의 조작에 응답하지 못해 사용자 체험이 매우 나빠진다
  • 어떠한 시간 소모 작업도 주 라인에서 진행해서는 안 된다. 그렇지 않으면 주 라인이 막힐 수 있다
  • 네트워크 상호작용은 시간 소모 조작에 속하기 때문에 네트워크 속도가 느리면 코드가 막히기 때문에 네트워크 상호작용의 코드는 메인 라인에 쓸 수 없다
  • 주 스레드가 너무 오래 막히면 ANR(Application Not Responding, 즉 응답이 없음) 예외가 발생
  • 메시지 대기열 메커니즘

  • 주 스레드가 생성되면 메시지 대기열(MessageQueue) 대상과 메시지 윤문기(Looper) 대상
  • 이 동시에 생성됩니다.
  • 휠체어의 역할은 끊임없이 메시지 대기열에 메시지가 있는지 검사하는 것이다
  • 메시지 대기열에 메시지가 있으면 윤문기는 메시지 대상을 메시지 처리기(Handler)
  • 에 전달한다.
  • 프로세서는handle Message () 방법을 호출하여 이 메시지를 처리하고handle Message () 방법은 메인 라인에서 실행되기 때문에 UI
    android.os.Handler handler = new android.os.Handler(){
        // Looper, , , , , UI
        public void handleMessage(Message msg) {
    
        }
    };
  • 를 새로 고칠 수 있습니다
  • 서브라인에서 메시지 대기열에 메시지 보내기
    // , handler.obtainMessage() new 
    Message msg = handler.obtainMessage();
    // obj , 
    msg.obj = bm;
    //what , , 
    msg.what = 1;
    // 
    handler.sendMessage(msg);
  • switch 문장을 통해 서로 다른 소식을 구분
    public void handleMessage(android.os.Message msg) {
        switch (msg.what) {
        // 1, 
        case 1:
            ImageView iv = (ImageView) findViewById(R.id.iv);
            Bitmap bm = (Bitmap) msg.obj;
            iv.setImageBitmap(bm);
            break;
        case 2:
            Toast.makeText(MainActivity.this, " ", 0).show();
            break;
        }       
    }
  • 요약: 메시지 대기열에 메시지가 있으면handleMessage() 방법이 호출됩니다.서브스레드 UI 리셋이 필요하면 프로세서 대상의sendMessage () 방법으로 메시지 대기열에 메시지를 보내고handleMessage () 방법으로 UI 리셋을 터치하면 됩니다

    캐시 이미지 추가 기능

  • 서버가 되돌아오는 흐름의 데이터를 읽고 로컬 파일 캐시에 쓰기
    InputStream is = conn.getInputStream();
    FileOutputStream fos = new FileOutputStream(file);
    byte[] b = new byte[1024];
    int len = 0;
    while((len = is.read(b)) != -1){
        fos.write(b, 0, len);
    }
        fos.close();
  • 캐시된 데이터를 읽고 비트맵 객체로 구성
    Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
  • 매번 요청을 보내기 전에 캐시에 같은 이름의 그림이 있는지 확인하고 존재하면 캐시를 읽기
  • 소스 코드를 가져오는 사이트

  • code.google.com
  • github.com
  • github에서 smart-image-view
  • 검색
  • 소스 오픈 프로젝트 스마트-image-view
  • 다운로드
  • 사용자 정의 구성 요소를 사용할 때 탭 이름은 패키지 이름을 써야 한다
    <com.loopj.android.image.SmartImageView/>
  • SmartImageView 사용
    SmartImageView siv = (SmartImageView) findViewById(R.id.siv);
    siv.setImageUrl("http://192.168.1.102:8080/dd.jpg");
  • Html 소스 뷰어

  • GET 요청 보내기
    URL url = new URL(path);
    // , 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    // 
    conn.setRequestMethod("GET");
    conn.setConnectTimeout(5000);
    conn.setReadTimeout(5000);
            //  conn.connect();
    // getResponseCode() , 
    if(conn.getResponseCode() == 200){
    
    }
  • 서버가 되돌아오는 흐름을 가져오고 흐름에서 html 원본을 읽는다
            InputStream is = conn.getInputStream();
    byte[] b = new byte[1024];
    int len = 0;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    while((len = is.read(b)) != -1){
        // 
        bos.write(b, 0, len);
    }
    // 
    //Android utf-8 
    text = new String(bos.toByteArray());
  • 무분별한 처리

  • 혼란의 발생은 서버 측과 클라이언트 코드표가 일치하지 않기 때문이다
    // 
    text = new String(bos.toByteArray(), "gb2312");
  • 데이터 제출


    GET 방식으로 데이터 전송

  • get 방식으로 제출한 데이터는 URL의 끝에 직접 연결
    final String path = "http://192.168.1.104/Web/servlet/CheckLogin?name=" + name + "&pass=" + pass;
  • get 요청을 보내는데 코드는 이전과 같다
    URL url = new URL(path);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setReadTimeout(5000);
    conn.setConnectTimeout(5000);
    if(conn.getResponseCode() == 200){
    
    }
  • 브라우저는 요청을 보낼 때 데이터를 URL로 인코딩하고 우리가 코드를 쓸 때도 중국어를 위한 URL 인코딩을 해야 한다(여기 사용자 이름name은 중국어를 사용한다)
    final String path = "http://192.168.1.104/Web/servlet/CheckLogin?name=" + URLEncoder.encode(name) + "&pass=" + pass;
  • POST 방식으로 데이터 전송

  • POST 제출 데이터는 서버로 전송됨
  • 프로토콜 헤더에 두 개의 속성이 더 있습니다
  • Content-Type: 응용 프로그램/x-www-form-urlencoded, 제출한 데이터를 설명하는 mimetype
  • Content-Length: 32, 제출한 데이터의 길이
    // post 
    String data = "name=" + URLEncoder.encode(name) + "&pass=" + pass;
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setRequestProperty("Content-Length", data.length() + "");
  • 설명
  • POST 요청을 열 수 있는 흐름 설정
    conn.setDoOutput(true);
  • 연결 대상의 출력 흐름을 가져오고 서버에 제출할 데이터를 흐름에 쓰기
    OutputStream os = conn.getOutputStream();
    os.write(data.getBytes());
  • 좋은 웹페이지 즐겨찾기