안드로이드/Network

firebase14강에서 했던 내용이다.


1. 콘텐츠(json양식) 웹(uri)에서 데이터를 가져오는 작업을 해보자. byOkHttp3

(1) 메인액티비티 xml의 텍스트뷰에 id를 주고 자바코드로 텍스트뷰 변수와 id를 참조하자.

(2) 웹에서 데이터를 가져오는 라이브러리 가운데, < okhttp >를 쓸 것이다.

[app] 우클릭 > open module settings > + > library dependency 에서 okhttp를 검색하자

- 나는,,, 검색이 안된다. * 그래서 그냥 okhttp3를 검색했다.


 - compile 'com.squareup.okhttp3:okhttp:3.5.0'


(3)메인액티비티에 void getTime(String url)매쏘드를 만들어, 호출될때 okHttp를 이용해 시간을 파싱하도록 할 것이다. 매쏘드내부에 OkHttpclient 객체를 만들고 그것을 이용해서 핸들러를 통해 통신하자.

- 아래코드처럼 작성할 때, new Request.Builder에서 에러가 난다. new R에서 .Builder까지 한번에 달려있는놈을 선택하자. 

리퀘스트빌더객체.url을 처리해주고. build().로 닫아준다. 그리고  enqueue(new C로 콜백매쏘드를 완성하자.

void getTime(String url){

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(new Request.Builder().url(url).build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {

}

@Override
public void onResponse(Call call, final Response response) throws IOException {

new Handler(getMainLooper()).post(new Runnable() {
@Override
public void run() {

try {
JSONObject jsonObject = new JSONObject(response.body().string());

textView.setText(jsonObject.getString("time"));

} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}
});

}
});

}

(4) 성공리스너인 onResponse()에서는, 이제 UI인 테스트 를 바꿔줘야한다. 이때, okHttp3는 쓰레드를 통해서 통신하기 때문에 <핸들러>를 사용해서 

ui에 접근해야한다. * 핸들러의 파라미터에는 getMainLooper()를 넣어주자. 뒤에 .post()를 붙혀서 new Runnable을 붙혀서 run()매쏘드를 만들자.


(5) url에는 json정보가 담겨있다. 먼저 JSONObject 객체를 만들어준다. 생성시 파라미터에 바로 url속 json정보들을 담을 수 있다.

     넘어오는 response.을 이용해 .body().string()를 호출하여 url속 json정보를 받로 받아온다.

     이때 try/catch로 한번 잡아줘야한다.


(6)이제 jsonObject에 담긴 정보들을 setText해준다. 웹에서 확인한 json속에 왼쪽 키값이 String value를 담고 있는 time을 확인할 수 있다.


{
   "time": "08:02:47 AM",
   "milliseconds_since_epoch": 1518249767764,
   "date": "02-10-2018"
}

                            JSONObject jsonObject = new JSONObject(response.body().string());


                            textView.setText(jsonObject.getString("time"));



=> url속 json 키값 "time" -> okhttp3 의 response.body() .toString() ->

     jsonObject = new JSONObject(response.body().string()); -> jsonObject.getString("time")





====================================================

참고) getMainLooper() : http://codetravel.tistory.com/19


getMainLooper() 함수는 Main Thread(UI Thread)가 사용하는 Looper 즉 Main Looper를 반환합니다.

이 함수는 호출하는 스레드가 메인 스레드이거나 메인 스레드가 아니어도 언제든지 Main Looper를 반환합니다.

참고 1) Main thread의 Main Looper와 Handler는 ActivityThread에서 자동으로 생성하기 때문에 개발자가 명시적으로 생성하지 않습니다.

참고 2) Looper.myLooper() 함수는 호출한 스레드의 Looper를 반환합니다.


크게 3가지의 경우에 사용합니다.

1. Handler를 생성할 때 Main Looper를 생성자의 인자로 전달하고 싶을 경우

즉, 작업자 스레드(UI thread가 아닌 스레드)에서 UI thread에게 "Runnabel 작업" 또는 "메시지"을 보내고 싶을 때 사용할 수 있는 방법입니다.

Main Looper를 인자로 넣으면 Main Looper의 Queue를 mQueue로 설정합니다. 이 부분이 중요합니다.

결론적으로 sendMessage() 또는 post()를 하게 되면 mQueue에, 즉 Main thread의 큐에 들어갑니다.

2. 현재 스레드의 루퍼가 Main Looper인지 아닌지 검사하고 싶을 경우

3. 현재 스레드가 Main thread(UI thread)인지 아닌지 검사하고 싶을 경우


===================================================

'안드로이드 > Network' 카테고리의 다른 글

OkHttp3 라이브러리로 json파싱하기  (0) 2018.02.10

+ Recent posts