운영체제 : Windows 8.1 64bit Android Studio : 1.5 작성날짜 : 2016-02-03 |
참고 : WhiteT's Repository - json 사용하여 파일 읽어오기
현's 블로그 - 안드로이드 AsyncTask,로딩중 표시, 웹서버 연결 통신
안드로이드 SDK 가 버전업되면서 비동기식으로 서버 연결 통신으로 해야 오류가 나지 않는다.
그리고 다른 클래스로 데이터를 전달하기 위해 핸들러를 사용하였다.
MainActivity.java
private void
getData_map(){
double start_lat
= 34.353022;
double start_lon = 125.961035;
double end_lat = 37.814617;
double end_lon = 127.922094;
Location start_location = new Location("");
Location end_location = new Location("");
start_location.setLatitude(start_lat);
start_location.setLongitude(start_lon);
end_location.setLatitude(end_lat);
end_location.setLongitude(end_lon);
parser =
new JsonParser(this);
parser.getData_map(handler, start_location, end_location, "0", "2000");
}
// DatabaseConnector에서 데이터를 전달받기 위한 핸들러
private Handler handler = new Handler(){
public void handleMessage(Message msg){
switch (msg.what){
case -1 : /*error 처리*/ break;
case 0 : String str = msg.obj.toString(); // DatabaseConnector에서 받은 데이터
JSONObject jObj = null;
if(str != null){
try{
jObj = new JSONObject(str);
} catch(Exception e){ e.printStackTrace(); }
}
if(jObj != null){
relicdatas = parser.getData_map_parser(jObj);
for(int i = 0 ; i < relicdatas.size() ; i++){
adapter.add(relicdatas.get(i));
}
} if(relicdatas.size() != 0){
textview.setText(relicdatas.size() + "");
} else {
textview.setText("relic is null");
}
break;
}
}
};
|
전송 받을 Json 양식
{ result_msg
: “success”,
data : {
main : {
type : “thing”,
o_id : “000001”,
o_name : “서울 숭례문”,
o_desc : “ 조선시대 서울도성을 둘러싸고 있던 성곽의 정문으로 원래 이름은 숭례문 이며, 남쪽에 있다고 해서 남대문이라고도
불렀다.",
image_url :
“11634.jpg”,
video_url :
”1212_324324.wmv”,
model_url: ”untitle.glb”,
ref : “한국민족문화대백과사전(00), 한국정신문화연구원,1991”,
addr : “서울”,
longitude : “126.23445353”,
latitude
: “37.12315432”,
}
}
} |
JsonParser.java
SERVER_URL : 데이터를 요청할 서버의 IP나 도메인 주소 및 jsp 파일 경로
START : 각각 매개변수에 해당하는 인자명
String SERVER_URL = "http://121.126.244.161:8080/k-culture_2/jsp/"; String START[] = {"objList.jsp?startX=", "&startY=", "&endX=", "&endY=", "&startYear=", "&endYear="}; public void getData_map(Handler handler, Location start_location, Location end_location, String startYear, String endYear){
String url = SERVER_URL + START[0] + start_location.getLongitude() + START[1] + start_location.getLatitude() + START[2] + end_location.getLongitude() + START[3] + end_location.getLatitude() + START[4] + startYear + START[5] + endYear; try{
new DatabaseConnecter(handler, "map").execute(url);
} catch (Exception e){ e.printStackTrace(); }
} public ArrayList<RelicData> getData_map_parser(JSONObject receiveData) {
ArrayList<RelicData> relicdatas = new ArrayList<RelicData>();
RelicData data = null;
try {
JSONObject jsonRootObject = receiveData;
if(jsonRootObject != null){
String msg = jsonRootObject.getString("result_msg");
if(msg.equals("success")){ JSONObject dataObj = jsonRootObject.getJSONObject("data");
int cnt = 0;
while(dataObj.getJSONObject(cnt + "") != null){ // 별도 처리
JSONObject getObj = dataObj.getJSONObject(cnt++ + ""); // 별도 처리
data = new RelicData();
data.setType(getObj.getString("type"));
data.setId(getObj.getString("o_id")); data.setTitle(getObj.getString("o_name"));
double longitude = Double.parseDouble(getObj.getString("longitude"));
double latitude = Double.parseDouble(getObj.getString("latitude"));
Location location = new Location("");
location.setLongitude(longitude);
location.setLatitude(latitude);
data.setLocation(location);
data.setStart_year(getObj.getString("startYear"));
data.setEnd_year(getObj.getString("endYear"));
relicdatas.add(data);
}
}
}
} catch (JSONException e) {e.printStackTrace();}
return relicdatas;
} |
DatabaseConnertor.java
public class DatabaseConnecter extends AsyncTask<String, String, String> { private Handler handler;
private Exception ex;
private String what_parser;
public DatabaseConnecter(Handler handler, String what){
this.handler = handler; what_parser = what;
} @Override protected String doInBackground(String... params) { // 비동기식 처리
JSONObject jObj = null;
HttpURLConnection conn = null; InputStream is = null;
BufferedReader br = null; String res = null;
try { String url = params[0];
URL req = new URL(url);
conn = (HttpURLConnection) req.openConnection();
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json");
int retCode = conn.getResponseCode();
is = conn.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
String line; StringBuffer response = new StringBuffer();
while((line = br.readLine()) != null) {
response.append(line);
response.append('\r');
}
res = response.toString();
} catch (Exception e) { e.printStackTrace();
} finally { if(conn != null) { try{conn.disconnect();}catch(Exception e) {} }
if(is != null){ try{is.close();}catch (Exception e){} }
if(br != null){ try{br.close();}catch (Exception e){} }
}
return res; }
@Override
protected void onPostExecute(String s) { // Async 작업이 종료 후 호출
if(ex != null){ Message msg = handler.obtainMessage();
msg.what = -1;
msg.obj = ex;
handler.sendMessage(msg);
} else{ Message msg = handler.obtainMessage();
if(what_parser.equals("map")){
msg.what = 0;
}
msg.obj = s;
handler.sendMessage(msg);
}
}
}
|