안드로이드 개발~WEB 액세스(GET) 외부 통신을 통해 데이터를 얻습니다.

15959 단어 AndroidJava

개시하다


안녕하세요.나는 모 학교에서 프로그래밍 등을 배우는 서버 측의 프로그래머 나루터다.
이번에도 안드로이드 개발해.
이번에는 안드로이드로 외부 네트워크를 연결해 데이터를 얻으려고 합니다.

대상

  • Java를 쓸 줄 아는 사람.
  • 안드로이드 개발에서도 괜찮은 사람.
  • 웹 액세스 개요


    1) 응용 프로그램에서 http에 접근한 원본 코드를 기술합니다.→ 응답 내용은 대부분 JSON 또는 XML입니다.
    2) 화면 위젯 WebView를 사용합니다.→ 응답의 내용은 원칙적으로 HTML이다.

    비동기 처리


    웹 액세스와 같이 처리에 시간이 걸리거나 예상치 못한 오류가 발생할 수 있는 경우 주 처리와 다른 루트에서 처리합니다. (비동기 처리)

    AsyncTask


    Android의 비동기식 프로세싱에서 UI 스레드와 상호 작용할 경우 AsyucTask 클래스를 사용하면 편리합니다.

    1. AsyncTask 사용 방법


    1) Asynuuuc Task를 상속받은 클래스를 만듭니다.
    → 활동 유형의 전문 멤버로 제작하면 편리하다.
    2) 메소드 DoInBackground()에 비동기적으로 처리하려는 프로세스를 기술합니다.
    → 이 방법은 Asyuc Task의 추상적인 방법이기 때문에 반드시 다시 써야 한다.
    3) 이벤트에서 클래스를 업데이트하고 excute () 방법을 실행합니다
    private class クラス名 extends AsyucTask< ... > {
      ...
      @Override
      public String doInBackground( String ... params ) {    
         // ここに非同期処理を記述
      }
    }
    その後
    クラス名 変数名 = new クラス名(); 
    変数名.execute( ... );
    
    * 메소드 매개변수의 "..."(3개의 점)은 가변 길이 매개변수를 나타냅니다.
    → 방법에서 매개 변수의 처리는 수조이다.

    2. 다른 방법


    AsyucTask는 DoInBackground() 이외에도 다음과 같은 방법이 있습니다.
    이러한 방법은 UI 스레드에서 실행되므로 화면 위젯을 조작할 수 있습니다.

  • onPostExecute (): DoInBackground () 가 끝난 후에 실행합니다.

  • onPreExecute(): DoInBackground()가 시작되기 전에 실행합니다.

  • onProgrish Progress (): DoInBackground () 에서publish Progress () 를 호출할 때 실행합니다.
  • 또한 활동에서 cancel () 을 호출할 때, DoInBackground () 가 끝난 후 onCancelled () 를 실행합니다.

    3. 열네릭스


    AsyucTask의 하위 클래스를 만들 때 Genesix에 세 가지 유형을 써야 합니다.
    → Void 유형을 지정할 필요가 없습니다.
    ...クラス名 extends AsyucTask<①String, ②Void, ③String> {
    
    ①Params
    execute() . 다중 InBackground()의 매개변수 유형입니다.
    →execute () 의 매개 변수는doInBackground () 의 매개 변수로 직접 전달
    ②Progress
    publishProgress() . onProgressiUpdate()의 매개변수 유형입니다.
    →publishProgress () 의 매개 변수는 onProgressUpdate () 의 매개 변수로 전달됩니다.
    ③Result
    doInBackground ()의 반환값과 onPostExecute ().onCanceled()의 매개변수 유형입니다.→doInBackground () 의 반환 값은 onPostExecute () 와 onCanceed () 의 매개 변수로 전달됩니다.

    http 액세스


    인터넷 접속 라이센스 제공


    src/main/AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
    허가 없이 인터넷 통신을 하면net.Socket Exception: socket failed: EACCES(Permission denied)는 예외가 발생합니다.

    인터넷에 연결


    객체를 사용합니다.

    URL 문자열을 설정합니다.

    URL url = new URL("URL文字列");
    

    연결

    con = (HttpURLConnection) url.openConnection();
    
    액세스 객체 URL 정보가 있는 URL 객체에 대해 URL#openConnection() 메서드를 실행하면 HDTURLconnection 객체(연결)를 얻을 수 있습니다.

    액세스 방법 설정


    setRequestMethod()를 사용합니다.
    ★이번엔 데이터를 얻기 위해 "GET"
    con.setRequestMethod("GET")
    

    실제 인터넷 연결


    URLconnection#connect()를 사용합니다.
    con.connect();
    

    연결 끊기


    disconnect()를 사용합니다.
    처리가 끝나면 불필요한 연결이 남지 않도록 연결을 명확히 끊어야 한다.
    con.disconnect()
    

    http 요청 시 샘플 코드

    private class クラス名 extends AsyncTask<String, Void, String> {
            private static final String DEBUG_TAG = "タグ";
    
            @Override
            public String doInBackground(String... params) {
                String urlStr = params[0];
                String id = params[1];
    
                HttpURLConnection con = null;
                InputStream is = null;
                String result = "";
    
                try {
                    URL url = new URL(urlStr);
                    con = (HttpURLConnection) url.openConnection();
                    con.setRequestMethod("GET");
                    con.connect();
                    is = con.getInputStream();
    
                    result = is2String(is);
                }
                catch(MalformedURLException ex) {
                    Log.e(DEBUG_TAG, "URL変換失敗", ex);
                }
                catch(IOException ex) {
                    Log.e(DEBUG_TAG, "通信失敗", ex);
                }
                finally {
                    if (con != null) {
                        con.disconnect();
                    }
                    if (is != null) {
                        try {
                            is.close();
                        }
                        catch (IOException ex) {
                            Log.e(DEBUG_TAG, "InputStream解除失敗", ex);
                        }
                    }
                }
                return result;
            }
    
            private String is2String(InputStream is) throws IOException {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                StringBuffer sb = new StringBuffer();
                char[] b = new char[1024];
                int line;
                while(0 <= (line = reader.read(b))) {
                    sb.append(b, 0, line);
                }
                return sb.toString();
            }
    }
    
    ü InputStream은 바이트를 읽는 클래스입니다.
    ● is2Str 등급을 주문 같은 것으로 써라.이유를 모르겠다.아시는 분은 말씀해 주세요.

    JSON의 처리


    JSONObject 레벨을 사용합니다.
    매개변수로 JSON 문자열을 지정합니다.
    그런 다음 목적 JSONObject, getString(...)을 얻으려면 다음과 같이 하십시오.에서 값을 가져옵니다.
  • 직접 내린 JSONObject의 취득은 getJSONObject(...)
  • 정하의 JSONarray(JSON 배열)를 획득한 것은 getJSONarray(...)
  • JSONarray가 지정한 JSONObject의 취득은 getJSONObject(...)
  • JSON 처리 시 샘플 코드

    private class クラス名 extends AsyncTask<String, Void, String> {
    
    
     @Override
     public void onPostExecute(String result) {
                String title = "";
                String text = "";
                String dateLabel = "";
                String telop = "";
                try {
                    JSONObject rootJSON = new JSONObject(result);
                    title = rootJSON.getString("title");
                    JSONObject descriptionJSON = rootJSON.getJSONObject("description");
                    text = descriptionJSON.getString("text");
                    JSONArray forecasts = rootJSON.getJSONArray("forecasts");
                    JSONObject forecastNow = forecasts.getJSONObject(0);
                    dateLabel = forecastNow.getString("dateLabel");
                    telop = forecastNow.getString("telop");
                }
                catch(JSONException ex) {
                    Log.e(DEBUG_TAG, "JSON解析失敗", ex);
                }
    
       }
    }
    
    이상.
    만약 무슨 잘못이 있으면 지적을 기다리시면 저에게 연락 주세요.
    끝까지 읽어주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기