방학 학교 과제를 하면서 공공데이터 API를 불러오는 어플리케이션을 만들게 되었습니다
이번 블로그에서는 어떻게 공공데이터를 불러오는가에 대한 코드를 작성합니다
데이터를 가공해서 보여주는 부분은 다음 블로그에 작성할 예정입니다
https://www.data.go.kr/index.do
이 사이트에 가서 본인이 찾고자하는 데이터 종류나 이름을 검색합니다
그 후에 이런 페이지가 나오는데 이때 오픈API로 지정해두고
오론쪽 아래 활용신청을 누르면 됩니다
신청을 하고 나면 왠만하면 바로 승인이 되는데 그러면 아래 있는 OpenApi명세 가이드대로 연습을 해보면 됩니다
공공데이터를 불러오기 위해서는 몇가지 사전 작업이 필요합니다
외부 데이터를 사용하기에 인터넷 연결을 허용해줘야합니다
추가로 네트워크로 접근하는것도 허용해줘야합니다
문자열을 URL로 볼 수 있게 설정해줘야합니다
AndroidManifest.xml
<mainfest xmlns:...
>
<uses-permission androi:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
...
android:usesCleartextTraffic="true"
위에 3개의 코드를 적어주면 됩니다
스레드란 프로그램내에서 실행되는 실행 단위를 말함
주로 메인스레드 한개만 있습니다
하지만 스레드가 2개라면? 더 많은 일을 병렬로 처리하기 가능해진다!
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread th = new Thread(new Runnable() {
@Override
public void run() {
int num = 1;
while (true) {
Log.i("Thread"," " + num);
num++;
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
});
th.start();
}
}
만약 어떤 제재도 없이 두 스레드가 서로 처리 중에 간섭을 하게 된다면 원치 않는 결과가 되거나 충돌이 되어 예기치 못하게 종료됩니다
그렇기에 모든 Workr Thread의 모든 UI 작업은 핸들러를 통해서 메인스레드에 보내진다!
MainActivity.java
public class MainActivity extends AppCompatActivity {
String key = "인코딩키";
TextView view;
String string_data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = findViewById(R.id.text1);
new Thread(new Runnable() {
@Override
public void run() {
try {
string_data = data();
runOnUiThread(new Runnable() {
@Override
public void run() {
text.setText(string_data);
}
})
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private String data() throws IOException {
// 각각의 정보를 넣어주기
StringBuilder urlBuilder = new StringBuilder("http://api.odcloud.kr/api/15055082/v1/uddi:0a5f4af0-3d39-4510-b26a-e53c24ea3b1e_201909051519");
// page
urlBuilder.append("?" + "page=1&perPage=10");
// service key
urlBuilder.append("&" + URLEncoder.encode("serviceKey", "UTF-8") + "="+ key);
URL url = new URL(urlBuilder.toString());
// 문자열로 된 요청 url을 URL객체로 생성
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
BufferedReader rd;
// getResponseCode 가 200과 300사이면 정상
if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300 ) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
StringBuilder sb = new StringBuilder();
String line;
while((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
conn.disconnect();
System.out.println(sb.toString());
return sb.toString();
}
}