[Android] 안드로이드 Retrofit2 예제 실습 따라하기
안드로이드 개발자 대부류 입니다.
Retrofit 은 안전한 타입 방식의 HTTP 클라이언트로서 Android 와 Java 애플리케이션을 위한 라이브러리 입니다.
요즘에 안드로이드 개발을 할때, 통신 부분은 왠만해서는 Retrofit 라이브러리를 쓰는 때문에 한번쯤 연습해보면 몸에 아주 좋은 영양소가 될것입니다. :)
제가 참고한 예제는 Realm 사이트에서 제공하는 예제를 따라하면서 다른 블로거분들의 글들을 쭈~욱 봤습니다. 그리고 현재 포스팅은 Retrofit2 사용에 따른 근본적인 이유 및 접근법을 설명하지 않고 절차적인 부분만 서술해 놨습니다. 꼭! 아래 참고 글을 보시는게 좋을거라고 생각합니다.
참고
1. Realm / Retorift2로 HTTP 호출하기
3. Getting started with Retrofit 2
4. Retrofit 2.0: The biggest update yet on the best HTTP Client Library for Android
[개발 환경]
OS : macOS Sierra
IDE : Android Studio
1. 네트워크 사용을 위해서 AndroidManifest.xml 에서 Internet Permission 을 허용해야 합니다.
1 2 3 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.INTERNET" /> </manifest> | cs |
2. Retrofit을 사용하기 위해서 build.gradle 파일에 라이브러리 추가
1 2 3 4 5 | dependencies { compile 'com.google.code.gson:gson:2.7' compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' } | cs |
3. 모델 클래스 만들기(데이터 그릇)
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Contributor { String login; String html_url; int contributions; @Override public String toString() { return login + "(" + contributions + ")"; } } | cs |
4. HTTP 통신을 하기 위한 서비스 인터페이스를 생성
1 2 3 4 5 6 7 | public interface GitHubService { @GET("repos/{owner}/{repo}/contributors") Call<List<Contributor>> repoContributors( @Path("owner") String owner , @Path("repo") String repo); } | cs |
5. Retrofit 객체를 GitHubService 에 생성
기본적인 Retrofit 객체 생성 형태는 아래와 같습니다만,
1 2 3 | public static final Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .build(); |
.addConverterFactory(GsonConverterFactory.create());
는 받아오는 Json 형식의 데이터를 Java 객체 형태로 변환 또는 반대 형식으로 변환시켜주는 Gson 라이브러리를 사용해야하기 때문에 수정합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | public interface GitHubService { @GET("repos/{owner}/{repo}/contributors") Call<List<Contributor>> repoContributors( @Path("owner") String owner , @Path("repo") String repo); public static final Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); } | cs |
6. HTTP 호출
동기적으로 HTTP 를 호출하기 위해서 인터페이스를 구현하고 Call 호출하기 위한 형태는 아래와 같습니다.
1 2 3 | GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class); Call<List<Contributor>> call = gitHubService.repoContributors(“square”, “retrofit”); List<Contributor> result = call.execute().body(); | cs |
그러나 Android 에서는 MainThread(UI Thread) 에서 네트워크 통신을 할 수 없도록 되어 있습니다.
위의 형태로 돌릴 경우 아래와 같은 에러 메세지가 떨어집니다.
02-04 19:32:55.190 1678-1678/com.example.jihoonryu.retrofit2_test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.jihoonryu.retrofit2_test, PID: 1678
android.os.NetworkOnMainThreadException
그렇기 때문에 AsyncTask 를 통해서 백그라운드 스레드에서 작동을 시켜야 합니다.
동기(Synchronous)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class); Call<List<Contributor>> call = gitHubService.repoContributors("square", "retrofit"); try { return call.execute().body().toString(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); TextView textView = (TextView) findViewById(R.id.textView); textView.setText(s); } }.execute(); | cs |
Retrofit2 의 장점은 동기적이던 비동기적이던 구현하기 쉬움에 있습니다. 비동기적(Asynchronously) 으로 구현할 경우는 자체적으로 백그라운드 스레드를 타기 때문에 그냥 구현해주면 됩니다.
비동기(Asynchronous)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class); Call<List<Contributor>> call = gitHubService.repoContributors("square", "retrofit"); call.enqueue(new Callback<List<Contributor>>() { @Override public void onResponse(Call<List<Contributor>> call, Response<List<Contributor>> response) { TextView textView = (TextView) findViewById(R.id.textView); textView.setText(response.body().toString()); } @Override public void onFailure(Call<List<Contributor>> call, Throwable t) { } }); | cs |
[[ 결과 화면 ]]
일단은 현재 이렇게 공부를 했습니다. 차후 Retrofit2 를 적용해서 간단한 뭔가를 직접 구현해보고 활용편을 올리겠습니다.
'Dev > Android' 카테고리의 다른 글
Android - RxAndroid/RxJava 의 combineLatest 예제 1 (0) | 2017.02.20 |
---|---|
Android - Screen Capture / 스크린캡쳐 하기 (2) | 2017.02.17 |
[Android] 안드로이드 TextUtils - TextView 빈값 null 검사 (0) | 2017.02.02 |
[Android] 안드로이드 SQLite 데이터 백업(Backup), 복원(Restore) (1) | 2017.01.16 |
[Android] 프로그래밍적으로 EditText 글자수 제한하기!! (0) | 2017.01.06 |