실천: 네트워크 프로그래밍

4548 단어
  • 한 응용 프로그램은 많은 곳에서 네트워크 기능을 사용할 수 있지만 HTTP 요청을 보내는 코드는 기본적으로 같다. 만약에 우리가 매번 HTTP 요청을 보내는 코드를 한 번씩 작성한다면 이것은 분명히 매우 나쁜 방법
  • 이다.
  • 이러한 통용되는 네트워크 조작을 하나의 공공 클래스에 추출하고 정적 방법을 제공해야 한다. 네트워크 요청을 할 때 이 방법을 간단하게 호출하면 된다.
  • public class HttpUtil {
        public static String sendHttpRequest(String address) {
            HttpURLConnection connection = null;
            try {
                URL url = new URL(address);
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(8000);
                connection.setReadTimeout(8000);
                connection.setDoInput(true);
                connection.setDoOutput(true);
                InputStream in = connection.getInputStream();
                BufferedReader reader = new BufferedReader(new
                InputStreamReader(in));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                return response.toString();
            } catch (Exception e) {
                e.printStackTrace();
                return e.getMessage();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    }
    

    앞으로 HTTP 요청이 필요할 때마다 이렇게 쓸 수 있습니다.
    String address = "http://www.baidu.com";
    String response = HttpUtil.sendHttpRequest(address);
    
  • 그러나sendHttpRequest () 방법의 내부에 라인이 열리지 않았습니다.sendHttpRequest () 방법을 호출할 때 메인 라인이 막힐 수 있습니다.
  • sendHttpRequest () 방법에서 HTTP 요청을 직접 시작할 수 없습니다. 서버가 응답한 데이터를 되돌릴 수 없기 때문입니다.모든 소모 논리는 하위 라인에서 이루어집니다.sendHttp Request () 방법은 서버가 응답하지 않을 때 실행이 끝나고 응답한 데이터를 되돌릴 수 없습니다.
  • Java의 콜백 메커니즘이 필요합니다.

  • 1. Http Callback Listener라는 이름의 인터페이스를 정의합니다.
    public interface HttpCallbackListener {
        void onFinish(String response);
        void onError(Exception e);
    }
    
  • onFinish() 방법은 서버가 요청에 성공적으로 응답할 때 호출하는 것을 나타낸다.
  • onError()는 네트워크 작업에 오류가 발생했을 때 호출됨을 나타냅니다.

  • 2. HttpUtil의 코드를 수정합니다.
    public class HttpUtil {
        public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    HttpURLConnection connection = null;
                    try {
                        URL url = new URL(address);
                        connection = (HttpURLConnection) url.openConnection();
                        connection.setRequestMethod("GET");
                        connection.setConnectTimeout(8000);
                        connection.setReadTimeout(8000);
                        connection.setDoInput(true);
                        connection.setDoOutput(true);
                        InputStream in = connection.getInputStream();
                        BufferedReader reader = new BufferedReader(new
                        InputStreamReader(in));
                        StringBuilder response = new StringBuilder();\
                        String line;
                        while ((line = reader.readLine()) != null) {
                            response.append(line);
                        }
                        if (listener != null) {
                            //   onFinish()  
                            listener.onFinish(response.toString());
                        }
                    } catch (Exception e) {
                        if (listener != null) {
                            //   onError()  
                            listener.onError(e);
                        }
                    } finally {
                        if (connection != null) {
                            connection.disconnect();
                        }
                    }
                }
            }).start();
        }
    }
    
  • 서브라인에서return 문장을 통해 데이터를 되돌릴 수 없음을 주의하십시오.
  • 따라서 서버가 응답하는 데이터를 HttpCallbackListener의 onFinish() 방법에 전송합니다.
  • 이상이 발생하면 onError () 방법으로 이상 원인을 전달합니다.

  • 3.sendHttpRequest () 방법으로 두 개의 인자를 받았기 때문에 호출할 때 HttpCallbackListener의 실례를 전송해야 합니다.
    HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {
        @Override
        public void onFinish(String response) {
            //                 
        }
        @Override
        public void onError(Exception e) {
            //             
        }
    });
    
  • 주의해야 할 것은 onFinish () 방법과 **onError () 방법은 결국 하위 라인에서 실행되는 **이기 때문에 우리는 여기서 어떠한 UI 조작도 할 수 없다.
  • 반환된 결과에 따라 UI를 업데이트해야 하는 경우에는 비동기식 메시징 메커니즘을 사용합니다.
  • 좋은 웹페이지 즐겨찾기