Apa itu Observer Pattern
Observer Pattern adalah pola desain perangkat lunak di mana ada suatu object(disebut sebagai Observable) secara otomatis memberi notifikasi kepada semua object yang memiliki dependency(disebut Observer) setiap ada perubahan data pada Observable.
Sedangkan di Android, Observable pattern sudah di handle oleh kelas bawaan Java yg sangat keren pada kelas java.util.Observable. Sehingga untuk dapat menggunakan fitur-fitur Observable dapat dilakukan dengan cara mengimport kelas java.util.Observable.
0 |
import java.util.Observable; |
Contoh kasus
Untuk memudahkan dalam memahami Observer Pattern di Android, dapat dilihat pada skenario berikut ini:
1. ActivityMain, Activity 2 dan Activity 3 adalah sama-sama Observer. ActivityMain dapat memanggil Activity 2 dan Activity 3.
2. Berikutnya adalah simulasi update value pada Observable yaitu berupa jumlah notifikasi.
3. Observable akan memberi notifikasi kepada semua Observer secara otomatis setiap ada perubahan data.
Object-object yg dibutuhkan antara lain:
- Observable object
Bertindak sebagai object Observable adalah kelas Notif.java
012345678910111213141516171819202122232425262728293031323334package com.research.hangga.myresearch.Objects;import android.util.Log;import java.util.Observable;/*** Copyright (C) PT. Sebangsa Bersama - All Rights Reserved* Unauthorized copying of this file, via any medium is strictly prohibited* Proprietary and confidential* Originally written by Hangga Aji Sayekti, 16/12/15*/public class Notif extends Observable {private int count;public int getCount() {return count;}public int update(){this.count++;setChanged();notifyObservers();return this.count;}public void setCount(int count) {Log.d("SB", String.valueOf(this.count));this.count = count;setChanged();notifyObservers();}} - Observers object dalam hal ini adalah ActivityMain, ActivitySecond dan ActivityThird sehingga ketiganya harus mengimplements Observer.
0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990package com.research.hangga.myresearch;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Button;import com.research.hangga.myresearch.Objects.BaseApplication;import java.util.Observable;import java.util.Observer;public class MainActivity extends AppCompatActivity implements Observer {@Overridepublic void update(Observable observable, Object data) {notifView.setCount(baseApplication.getNotif().getCount());}private BaseApplication baseApplication;private NotifView notifView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);toolbar.setTitle(R.string.activity_main);toolbar.setNavigationIcon(R.mipmap.reindeer_icon);setSupportActionBar(toolbar);baseApplication = (BaseApplication) getApplication();baseApplication.getNotif().addObserver(this);notifView = new NotifView(MainActivity.this);Button btnUpdate = (Button) findViewById(R.id.btnUpdate);btnUpdate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {baseApplication.getNotif().update();}});Button btnSecond = (Button) findViewById(R.id.btnSecond);btnSecond.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(MainActivity.this,SecondActivity.class));}});Button btnThird = (Button) findViewById(R.id.btnThird);btnThird.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(MainActivity.this,ThirdActivity.class));}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main, menu);MenuItem itemNotif = menu.findItem(R.id.action_notif);itemNotif.setActionView(notifView);notifView.setCount(baseApplication.getNotif().getCount());return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_notif) {return true;}return super.onOptionsItemSelected(item);}}