Cara Implementasi Sederhana Retrofit dan RxJava di Android Studio + Source Code
Ditulis pada: Juni 28, 2018
kali ini Rival akan membahas mengenai Implementasi Sederhana Retrofit dan RxJava. Seperti banyak yang kita ketahui, Library retrofit ini untuk menangani kasus disaat kamu request url API dan Library RxJava bertujuan untuk melakukan proses asynchronous pada sebuah program dengan kosep observables sequence. Untuk contoh implementasi pada tutorial ini kita akan menggabungkan 2 library yang sudah saya sebutkan, dan untuk APInya kita akan menggunakan API dari layanan Github.
Penjelasan singkat tentang apa sih itu RxJava, RxAndroid itu apa? Kalau dikutip saka kaca resmi iku: RxJava minangka implementasine VM Java Reactive Extensions: perpustakaan kanggo nyusun program asynchronous lan acara-acara kanthi nggunakake urutan sing bisa ditemokake.
Iku ngluwihi pola pangamat kanggo ndhukung urutan data / acara lan nambah operator sing ngidini sampeyan nyipta urutan bebarengan declaratively nalika abstracting langsung uneg-uneg babagan kaya threading tingkat rendah, sinkronisasi, thread-safety lan data bebarengan data.
Persiapan Implementasi Retrofit dan RxJava Android
- Kita akan menggunakan API dari Github : https://api.github.com/users/farizdotid/repos
- Buat project dengan nama SampleRetrofitRx
- Aplikasi postman
- Plugin RoboPojoGenerator sudah terinstall di Android Studio kamu.
Eksekusi Implementasi Retrofit dan RxJava
Pertama,
Buka file build.gradle ( Module:app ) lalu tambahahkan library-library berikut :
implementation 'com.android.support:support-vector-drawable:27.1.1'Untuk full source code di build.gradle ( Module:app ) seperti ini :
implementation 'com.android.support:support-v4:27.1.1'
implementation 'com.android.support:cardview-v7:27.1.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.6'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.farizdotid.sampleretrofitrx"
minSdkVersion 19
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
implementation 'com.android.support:design:27.1.1'
implementation 'com.android.support:support-vector-drawable:27.1.1'
implementation 'com.android.support:support-v4:27.1.1'
implementation 'com.android.support:cardview-v7:27.1.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.6'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}Kedua,
Buka file AndroidManifest.xml lalu tambahkan permission untuk Internet, karena pada tutorial implementasi retrofit dan rxjava ini kita akan berurusan dengan internet. Tambahkan kode berikut :
<uses-permission android:name="android.permission.INTERNET"/>
Ketiga,
Buatlah struktur directory package seperti ini :
Directory package apiservice : untuk menampung class class yang berhubungan dengan network / ngehit API.
Directory package model : untuk menampung class class yang kita butuhkan keperluan data.
Keempat,
Buatlah class baru dengan nama RetrofitClient pada directory package apiservice seperti dibawah ini
Kelima,private static Retrofit retrofit = null;public static Retrofit getClient(String baseUrl){HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).readTimeout(10, TimeUnit.SECONDS).connectTimeout(30, TimeUnit.SECONDS).build();if (retrofit == null){retrofit = new Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).client(client).build();}return retrofit;}
Buatlah interface baru dengan nama BaseApiService pada directory package apiservice buat seperti dibawah ini:
Keenam,/*Fungsi @Path disini adalah untuk mengisi value yang sudah kita set.Contoh : {username} disini nantinya akan diisi dengan kebutuhan yang disesuaikan.Observable disini ialah dari RxJava. Karena pada contoh disini kita akan menggabungkanRetrofit dengan RxJava.*/@GET("users/{username}/repos")Observable<List<ResponseRepos>> requestRepos(@Path("username") String username);
Buatlah class baru dengan nama UtilsApi pada directory package apiservice lalu buatlah seperti dibawah ini.
Ketujuh,
Buka url API berikut di browser ataupun aplikasi postman : https://api.github.com/users/farizdotid/repos dan hasil dari API berikut berupa format Json. Copy hasil dari hit API tersebut lalu klik kanan pada directory package model ➝ New ➝ Generate POJO from JSON ➝ Paste hasil dari hit API ➝ ok.
Pastikan kamu memilih GSON dan jangan lupa untuk memberi nama file tersebut. Contoh disini saya memberikan nama dengan ResponseRepos. Kegunaan plugin tersebut pada saat kita generate plugin akan otomatis membuat file sesuai dengan hasil json yang sudah kita paste.
Kedelapan,
Buat layout baru dengan nama item_repo. Caranya dengan res ➝ layout ➝ klik kanan pada directory layout ➝ new. Untuk kode layout tersebut adalah sebagai berikut :
Layout item_repo ini berfungsi untuk tampilan pada list RecyclerView. Jadi sebelum membuat adapter untuk RecyclerView alangkah lebih baiknya kita membuat layout itemnya terlebih dahulu.<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"app:contentPadding="8dp"app:cardCornerRadius="4dp"android:layout_marginBottom="8dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/tvName"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:text="Nama Repo"android:textSize="16sp"android:textColor="@color/primary_text"/><TextViewandroid:id="@+id/tvDesc"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="4dp"tools:text="Desc Repo"android:textSize="14sp"android:textColor="@color/secondary_text"/></LinearLayout></android.support.v7.widget.CardView>
Kesembilan,
Buat class dengan nama ReposAdapter. Lalu isi dengan kode berikut :
Kesepuluh,public class ReposAdapter extendsRecyclerView.Adapter<ReposAdapter.ViewHolder> {private static final String TAG = ReposAdapter.class.getSimpleName();private Context context;private List<Repo> list;private AdapterCallback mAdapterCallback;public ReposAdapter(Context context, List<Repo> list, AdapterCallback adapterCallback) {this.context = context;this.list = list;this.mAdapterCallback = adapterCallback;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_repo,parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {Repo item = list.get(position);String name = item.getName();String description = item.getDescription();holder.tvName.setText(name);holder.tvDesc.setText(description);}@Overridepublic int getItemCount() {return list.size();}public void clear() {int size = this.list.size();this.list.clear();notifyItemRangeRemoved(0, size);}public class ViewHolder extends RecyclerView.ViewHolder {@BindView(R.id.tvName)TextView tvName;@BindView(R.id.tvDesc)TextView tvDesc;public ViewHolder(View itemView) {super(itemView);ButterKnife.bind(this, itemView);}}public interface AdapterCallback {void onRowClicked(int position);}}
Buka file activity_main.xml lalu tambahkan komponen seperti ini :
Jika ada yang error pada bagian @drawable/ic_github kalian bisa menambahkan terlebih dahulu file drawablenya dengan cara res ➝ drawable ➝ klik kanan pada package drawable ➝ new ➝ Drawable Resource File ➝ buat dengan nama ic_github ➝ OK. Isi dengan kode berikut :<?xml version="1.0" encoding="utf-8"?><LinearLayout 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"android:orientation="vertical"android:focusable="true"android:focusableInTouchMode="true"tools:context=".MainActivity"><ImageViewandroid:layout_width="48dp"android:layout_height="48dp"android:layout_marginTop="16dp"app:srcCompat="@drawable/ic_github"android:layout_gravity="center"tools:ignore="ContentDescription" /><EditTextandroid:id="@+id/etUsername"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginStart="16dp"android:layout_marginEnd="16dp"android:layout_marginTop="16dp"android:fontFamily="sans-serif-light"android:textColor="@color/primary_text"android:textColorHint="@color/primary_text"android:inputType="text"android:imeOptions="actionSearch"android:hint="@string/username_github"/><ProgressBarandroid:id="@+id/pbLoading"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:visibility="gone"android:layout_gravity="center"/><android.support.v7.widget.RecyclerViewandroid:id="@+id/rvRepos"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="16dp"/></LinearLayout>
<vektor xmlns: android = "http://schemas.android.com/apk/res/android"android: width = "24dp"Android: dhuwur = "24dp"Android: viewportWidth = "24"Android: viewportHeight = "24"><pathAndroid: fillColor = "# FF000000"android: pathData = "M12,0.297c-6.63,0 -12,5.373 -12,12 0,5.303 3.438,9.8 8.205,11.385 0.6,0.113 0.82, -0.258 0.82, -0.577 0, -0.285 -0.01, -1.04 -0.015, -2.04 -3.338,0.724 -4.042, -1.61 -4.042, -1.61C4.422,18.07 3.633,17.7 3.633,17.7c-1.087, -0.744 0.084, -0.729 0.084, -0.729 1.205,0.084 1.838,1.236 1.838,1.236 1.07,1.835 2.809,1.305 3.495,0.998 0.108, -0.776 0.417, -1.305 0.76, -1.605 -2.665, -0.3 -5.466, -1.332 -5.466, -5.93 0, -1.31 0.465, -2.38 1.235, - 3.22 -0.135, -0.303 -0.54, -1.523 0.105, -3.176 0,0 1.005, -0.322 3.3,1.23 0.96, -0.267 1.98, -0.399 3, -0.405 1.02.0.006 2.04,0.138 3,0.405 2.28, -1.552 3.285, -1.23 3.285, -1.23 0.645,1.653 0.24,2.873 0.12,3.176 0.765,0.84 1.23,1.91 1.23,3.22 0,4.61 -2.805,5.625 -5.475,5.92 0.42,0.36 0.81,1.096 0.81,2.22 0,1.606 - 0.015,2.896 -0.015,3.286 0,0.315 0.21,0.69 0.825,0.57C20.565,22.092 24,17.592 24,12.297c0, -6.627 -5.373, -12 -12, -12 "/></ vector>
Kesebelas,
Buka MainActivity.java lalu inisialisasi komponen-komponen yang sudah kamu buat terlebih dahulu.
Lalu inisialisasi file-file pembantu seperti BaseApiService dan ReposAdapter.@BindView(R.id.pbLoading)ProgressBar pbLoading;@BindView(R.id.rvRepos)RecyclerView rvRepos;@BindView(R.id.etUsername)EditText etUsername;
Pada method onCreate isi dengan kode berikut :BaseApiService mApiService;ReposAdapter mRepoAdapter;
Jika ada error pada bagian requestRepos(username); biarkan saja karena kamu belum membuat fungsi tersebut.ButterKnife.bind(this);mApiService = UtilsApi.getAPIService();/*inisialisasi adapter dan recyclerview*/mRepoAdapter = new ReposAdapter(this, repoList, null);rvRepos.setLayoutManager(new LinearLayoutManager(this));rvRepos.setItemAnimator(new DefaultItemAnimator());rvRepos.setHasFixedSize(true);rvRepos.setAdapter(mRepoAdapter);etUsername.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {/*EditorInfo.IME_ACTION_SEARCH ini berfungsi untuk men-set keyboard kamuagar enter di keyboard menjadi search.*/if (actionId == EditorInfo.IME_ACTION_SEARCH) {String username = etUsername.getText().toString();requestRepos(username);return true;}return false;}});
Keduabelas,
Buatlah sebuah fungsi dengan nama requestRepos dan tambahkan fungsi tersebut dengan parameter String username. Untuk kodenya seperti berikut :
Kegunaan fungsi tersebut adalah untuk meng-request hit ke API yang sudah kita persiapkan dan hasil data dari request hit tersebut kita olah menggunakan RxJava. Parameter username disini untuk kebutuhan user input username githubnya karena pada contoh implementasi retrofit dan rxjava disini url API kita set dynamic yang artinya berubah-ubah.private void requestRepos(String username) {pbLoading.setVisibility(View.VISIBLE);mApiService.requestRepos(username).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<List<ResponseRepos>>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(List<ResponseRepos> responseRepos) {/*onNext disini ketika data sudah masuk dan biasanya kita memasukan data APIke lokal ataupun sesuai kebutuhan kamu. Di contoh ini data dari API Server dimasukandalam List repoList.*/for (int i = 0; i < responseRepos.size(); i++) {String name = responseRepos.get(i).getName();String description = responseRepos.get(i).getDescription();repoList.add(new Repo(name, description));}}@Overridepublic void onError(Throwable e) {Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();}@Overridepublic void onComplete() {pbLoading.setVisibility(View.GONE);Toast.makeText(MainActivity.this, "Berhasil mengambil data", Toast.LENGTH_SHORT).show();mRepoAdapter = new ReposAdapter(MainActivity.this, repoList, null);rvRepos.setAdapter(mRepoAdapter);mRepoAdapter.notifyDataSetChanged();}});}
Untuk full source code di MainActivity.java adalah sebagai berikut :
Ketigabelas,public class MainActivity extends AppCompatActivity {/*inisialisasi komponen komponen yang sudah kita buat di layout activity_main.xml*/@BindView(R.id.pbLoading)ProgressBar pbLoading;@BindView(R.id.rvRepos)RecyclerView rvRepos;@BindView(R.id.etUsername)EditText etUsername;/*inisialisasi file pembantu yang sudah kita buat.BaseApiService : untuk persoalan request APIReposAdapter : untuk kebutuhan adapter RecyclerView*/BaseApiService mApiService;ReposAdapter mRepoAdapter;List<Repo> repoList = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);mApiService = UtilsApi.getAPIService();/*inisialisasi adapter dan recyclerview*/mRepoAdapter = new ReposAdapter(this, repoList, null);rvRepos.setLayoutManager(new LinearLayoutManager(this));rvRepos.setItemAnimator(new DefaultItemAnimator());rvRepos.setHasFixedSize(true);rvRepos.setAdapter(mRepoAdapter);etUsername.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {/*EditorInfo.IME_ACTION_SEARCH ini berfungsi untuk men-set keyboard kamuagar enter di keyboard menjadi search.*/if (actionId == EditorInfo.IME_ACTION_SEARCH) {String username = etUsername.getText().toString();requestRepos(username);return true;}return false;}});}/*Fungsi untuk berkomunikasi dengan API Server menggunakan library Retrofit dan RxJava.*/private void requestRepos(String username) {pbLoading.setVisibility(View.VISIBLE);mApiService.requestRepos(username).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<List<ResponseRepos>>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(List<ResponseRepos> responseRepos) {/*onNext disini ketika data sudah masuk dan biasanya kita memasukan data APIke lokal ataupun sesuai kebutuhan kamu. Di contoh ini data dari API Server dimasukandalam List repoList.*/for (int i = 0; i < responseRepos.size(); i++) {String name = responseRepos.get(i).getName();String description = responseRepos.get(i).getDescription();repoList.add(new Repo(name, description));}}@Overridepublic void onError(Throwable e) {Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();}@Overridepublic void onComplete() {pbLoading.setVisibility(View.GONE);Toast.makeText(MainActivity.this, "Berhasil mengambil data", Toast.LENGTH_SHORT).show();mRepoAdapter = new ReposAdapter(MainActivity.this, repoList, null);rvRepos.setAdapter(mRepoAdapter);mRepoAdapter.notifyDataSetChanged();}});}}
SIlahkan jalankan aplikasi dan semoga berjalan dengan lancar.
Donwload Source Code Sample Retrofix Rx
Lihat Juga Artikel menarik lainnya dibawah Ini:
- Cara menjalankan Project Android Studio Langsung Dari Ponsel Android Tanpa pake Emulator
- Kumpulan Source Code Pendataan Alumni sekolahan Menggunakan Web based PHP Native 7.0
- 2 Cara Mengatasi Program Unity Error Di Os Ubuntu Versi 14.04
- Cara buat Aplikasi SMS Banking dengan Gammu menggunakan Script PHP dan MySQL
- Cara membuat Aplikasi Manajemen Surat menggunakan Script PHP dan Database MySQLi
- Download Source Code Music Player Mp3 Project Android Studio Full Version