728x90
Maria DB ↔ PHP ↔ Android 연동하기 - 3. 외부 접속 설정하기 를 안 보셨다면 먼저 보시는 것을 추천드립니다.
전 포스팅에서 로컬에 있는 php 파일을 외부에서 접근할 수 있게 해 주었습니다. 이제 이 php 파일에 있는 JSON을 파싱 해서 사용하겠습니다.
먼저 인터넷을 사용해야 하기 때문에 Manifest.xml에 인터넷 사용허가 코드를 넣어줘야 합니다.
추가로 안드로이드 Pi 버전이상을 사용 중이라면 application 태그 안에 androidandroid:usesCleartextTraffic="true"도 추가해줘야 합니다.
추가하지 않으면 ava.io.IOException: Cleartext HTTP traffic to not permitted 에러가 발생하게 됩니다.
<uses-permission android:name="android.permission.INTERNET"/>
<application
...
android:usesCleartextTraffic="true">
</application>
파싱 한 값을 저장할 클래스를 하나 만들어줍니다.
public class Tree {
String name; // 이름
String category; // 카테고리
String keyword; // 키워드
...
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
...
}
get과 set은 일일이 입력하는 것보다 변수를 입력하고 드래그 후 Alt + Insert를 눌러 Getter and Setter를 눌러주고 추가를 해줍니다.
activity_main.xml에는 간단하게 TextView만 넣어주었습니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="173dp"
android:layout_marginLeft="173dp"
android:layout_marginTop="347dp"
android:text="Hello World!" />
</RelativeLayout>
MainActivity.java에는 AsyncTask를 사용합니다.
package com.example.treemanagement;
import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private String jsonString;
ArrayList<Tree> treeArrayList; // 나무정보들을 저장할 ArrayList
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
JsonParse jsonParse = new JsonParse(); // AsyncTask 생성
jsonParse.execute("http://아이피주소:포트번호/php명.php"); // AsyncTask 실행
}
public class JsonParse extends AsyncTask<String, Void, String> {
String TAG = "JsonParseTest";
@Override
protected String doInBackground(String... strings) { // execute의 매개변수를 받아와서 사용
String url = strings[0];
try {
URL serverURL = new URL(url);
HttpURLConnection httpURLConnection = (HttpURLConnection) serverURL.openConnection();
httpURLConnection.setReadTimeout(5000);
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.connect();
int responseStatusCode = httpURLConnection.getResponseCode();
InputStream inputStream;
if(responseStatusCode == HttpURLConnection.HTTP_OK) {
inputStream = httpURLConnection.getInputStream();
}
else{
inputStream = httpURLConnection.getErrorStream();
}
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder sb = new StringBuilder();
String line;
while((line = bufferedReader.readLine()) != null){
sb.append(line);
}
bufferedReader.close();
Log.d(TAG, sb.toString().trim());
return sb.toString().trim(); // 받아온 JSON의 공백을 제거
} catch (Exception e) {
Log.d(TAG, "InsertData: Error ", e);
String errorString = e.toString();
return null;
}
}
@Override
protected void onPostExecute(String fromdoInBackgroundString) { // doInBackgroundString에서 return한 값을 받음
super.onPostExecute(fromdoInBackgroundString);
if(fromdoInBackgroundString == null)
textView.setText("error");
else {
jsonString = fromdoInBackgroundString;
treeArrayList = doParse();
Log.d(TAG,treeArrayList.get(0).getName());
textView.setText(treeArrayList.get(0).getName());
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
private ArrayList<Tree> doParse() {
ArrayList<Tree> tmpTreeArray = new ArrayList<Tree>();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray("Tree");
for(int i=0;i<jsonArray.length();i++) {
Tree tmpTree = new Tree();
JSONObject item = jsonArray.getJSONObject(i);
tmpTree.setName(item.getString("이름"));
tmpTree.setCategory(item.getString("카테고리"));
tmpTree.setKeyword(item.getString("키워드"));
tmpTree.setNumber(item.getInt("보유수량"));
tmpTree.setPrice(item.getInt("주당가격"));
tmpTree.setLocation(item.getString("위치"));
tmpTree.setEct(item.getString("특이사항"));
tmpTree.setTreeHeight(item.getString("수고"));
tmpTree.setRootCollar(item.getString("근원직경"));
tmpTree.setBreastHeight(item.getString("흉고직경"));
tmpTree.setWidthCrown(item.getString("수관폭"));
tmpTree.setLength(item.getString("수관길이"));
tmpTree.setCrownHeight(item.getString("지하고"));
tmpTree.setManner(item.getString("육종방법"));
tmpTree.setDateTime(item.getString("입력시간"));
tmpTreeArray.add(tmpTree);
}
} catch (JSONException e) {
e.printStackTrace();
}
return tmpTreeArray;
} // JSON을 가공하여 ArrayList에 넣음
}
}
로그를 확인해보면 제대로 받아와 지는 것을 확인할 수 있습니다.
728x90
'Programming > Android' 카테고리의 다른 글
안드로이드 스튜디오 TableLayout 사용하기 (0) | 2020.03.31 |
---|---|
Maria DB ↔ PHP ↔ Android 연동하기 - 5. 어플에서 php로 데이터 전송 (2) | 2020.03.24 |
안드로이드 스튜디오 구글 맵의 범위 안에만 마커 사용하기 (6) | 2020.03.10 |
안드로이드 스튜디오 구글 맵 마커 묶어보여주기(클러스터 사용하기) (0) | 2020.03.09 |
안드로이드 스튜디오 구글 맵에 마커 넣기 (15) | 2020.03.09 |