Android Reactive Programming (Part 1)

Budi Oktaviyan
3 min readJan 31, 2017

--

Dunia pemrograman selalu memiliki misteri dan hal-hal baru yang terus menerus perlu kita update sebagai seorang programmer. Beberapa tahun belakangan ini banyak sekali bermunculan paradigma-paradigma baru dalam dunia pemrograman, salah satu paradigma tersebut adalah Reactive Programming.

Apa sebenarnya Reactive Programming tersebut ? menurut Wikipedia, yaitu…

Reactive programming is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow

Jadi, menurut opini Saya sendiri Reactive Programming itu adalah paradigma pemrograman yang berorientasi pada alur proses perubahan data, yang dimana data tersebut bisa saja statis ataupun dinamis.

Paradigma dari Reactive itu sendiri hampir ada di setiap bahasa pemrograman, dan salah satu library yang mendukung hal tersebut adalah ReactiveX. Apa sebenarnya ReactiveX ini ???

An API for asynchronous programming with observable streams

ReactiveX ini sendiri mempunyai 5 tipe scheduler, berikut ini penjelasan dari masing-masing tipe tersebut:

  • immediate(): Inisialisasi dan mengembalikan data pada suatu scheduler yang dapat di eksekusi sesegera mungkin (immediately execute) dalam suatu thread/ui thread yang sama.
  • trampoline(): Inisialisasi dan mengembalikan data pada suatu scheduler yang dapat di eksekusi secara bergantian (queuing schedule) dalam suatu thread/ui thread yang sama. data berikutnya akan segera di proses ketika data yang pertama sudah selesai, dan seterusnya akan seperti itu sampai proses eksekusi terhadap data tersebut sudah habis.
  • newThread(): Inisialisasi dan mengembalikan data pada suatu scheduler dimana ketika proses eksekusi akan selalu membuat thread baru.
  • computation(): Inisialisasi dan mengembalikan data pada suatu scheduler yang dapat digunakan untuk proses komputasi (perhitungan) terhadap data yang sedang di eksekusi. Fungsi ini juga dapat digunakan sebagai event-loop, melakukan proses callback dan berbagai proses komputasi lainnya.
  • io(): Inisialisasi dan mengembalikan data pada suatu scheduler yang dapat di bind dalam suatu proses input/output (io process). Adapun implementasi dari tipe ini di proses melalui thread-pool yang dapat bertambah jumlah thread nya setiap saat sesuai kebutuhan. Tipe ini juga dapat digunakan dalam proses asynchronous blocking io.

Lalu, bagaimana caranya agar kita bisa melakukan implementasi Reactive Programming ini pada Android ? Saya akan coba memaparkan-nya secara sederhana :)

Tambahkan terlebih dahulu dependencies ini ya…

dependencies {
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.2.4'
}

Lalu, kita buat simple layout untuk mengimplementasikan konsep pemrograman Reactive tersebut…

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:targetApi="LOLLIPOP">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="@color/colorAccent"
android:elevation="4dp"
app:theme="@style/AppTheme.Toolbar" />

<Button
android:id="@+id/btn_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:paddingBottom="16dp"
android:paddingTop="16dp"
android:text="@string/btn_schedule"
android:textColor="@color/colorPrimaryDark"
android:textSize="16sp" />
</RelativeLayout>

Setelah itu kita coba buatkan simple calling dari ReactiveX tersebut…

public class MainActivity extends AppCompatActivity {
Subscription subscription;

@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initToolbar();
addButtonListener();
}

@Override
protected void onDestroy() {
if (null != subscription && !subscription.isUnsubscribed()){
subscription.unsubscribe();
}

super.onDestroy();
}

public void doSubscribe() {
subscription = Observable.just("Hello Reactive!").observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Toast.makeText(MainActivity.this, "Finish Subscribing...", Toast.LENGTH_SHORT).show();
}

@Override
public void onError(final Throwable e) {
e.printStackTrace();
}

@Override
public void onNext(final String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
});
}

private void initToolbar() {
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_main);
toolbar.setTitle(getTitle());
setSupportActionBar(toolbar);
}

private void addButtonListener() {
final Button button = (Button) findViewById(R.id.btn_main);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
Toast.makeText(MainActivity.this, "Start Subscribing...", Toast.LENGTH_SHORT).show();
doSubscribe();
}
});
}
}

Pada implementasi di atas Saya menggunakan tipe io() … Untuk lebih jelasnya bisa dapat dilihat pada source code berikut ini

Pada artikel selanjutnya, Saya akan coba menjelaskan implementasi REST API dengan menggunakan Retrofit dan ReactiveX

--

--

Budi Oktaviyan
Budi Oktaviyan

Written by Budi Oktaviyan

The only way to do great work, is to love what you do

Responses (2)