안드로이드 개발~WEB 액세스(GET) 외부 통신을 통해 데이터를 얻습니다.
개시하다
안녕하세요.나는 모 학교에서 프로그래밍 등을 배우는 서버 측의 프로그래머 나루터다.
이번에도 안드로이드 개발해.
이번에는 안드로이드로 외부 네트워크를 연결해 데이터를 얻으려고 합니다.
대상
웹 액세스 개요
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 스레드에서 실행되므로 화면 위젯을 조작할 수 있습니다.
웹 액세스와 같이 처리에 시간이 걸리거나 예상치 못한 오류가 발생할 수 있는 경우 주 처리와 다른 루트에서 처리합니다. (비동기 처리)
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 스레드에서 실행되므로 화면 위젯을 조작할 수 있습니다.
private class クラス名 extends AsyucTask< ... > {
...
@Override
public String doInBackground( String ... params ) {
// ここに非同期処理を記述
}
}
その後
クラス名 変数名 = new クラス名();
変数名.execute( ... );
onPostExecute (): DoInBackground () 가 끝난 후에 실행합니다.
onPreExecute(): DoInBackground()가 시작되기 전에 실행합니다.
onProgrish Progress (): DoInBackground () 에서publish Progress () 를 호출할 때 실행합니다.
3. 열네릭스
AsyucTask의 하위 클래스를 만들 때 Genesix에 세 가지 유형을 써야 합니다.
→ Void 유형을 지정할 필요가 없습니다.
...クラス名 extends AsyucTask<①String, ②Void, ③String> {
①Paramsexecute() . 다중 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(...)을 얻으려면 다음과 같이 하십시오.에서 값을 가져옵니다.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
URL url = new URL("URL文字列");
con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET")
con.connect();
con.disconnect()
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();
}
}
JSONObject 레벨을 사용합니다.
매개변수로 JSON 문자열을 지정합니다.
그런 다음 목적 JSONObject, getString(...)을 얻으려면 다음과 같이 하십시오.에서 값을 가져옵니다.
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);
}
}
}
이상.만약 무슨 잘못이 있으면 지적을 기다리시면 저에게 연락 주세요.
끝까지 읽어주셔서 감사합니다.
Reference
이 문제에 관하여(안드로이드 개발~WEB 액세스(GET) 외부 통신을 통해 데이터를 얻습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/watataku8911/items/a34ff1f5927c0b32f0ab텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)