Optimisasi
Setelah menyelesaikan bab ini, pelajar diharapkan menguasai :
● Mengetahui teknik yang berbeda dalam optimisasi aplikasi mobile
9.2 Optimisasi
Sebelum benar-benar melakukan setiap optimisasi pada program Anda, Anda seharusnya perlu
memastikan bahwa package software anda memiliki kualitas yang baik. Anda perlu
meletakkan optimisasi dalam agenda Anda. Beberapa teknik yang dibahas pada bab ini
seharusnya dapat membantu dalam menghindari beberapa kesalahan pemrograman.
9.3 Eksekusi program
9.3.1 Gunakan StringBuffer sebagai pengganti String.
Anda perlu ingat bahwa pada Java, object String bersifat absolut atau abadi. Menggunakan
method String menciptakan suatu object String terpisah. Perangkaian String yang sederhana
menciptakan suatu object String ganda (kecuali jika String itu bersifat konstan dan kompiler
cukup pandai untuk menggabungkan mereka pada proses compile berlangsung).
Menggunakan StringBuffer tidak hanya mengoptimalkan runtime program Anda (lebih sedikit
menimbulkan object runtime), itu juga mengoptimalkan pemakaian memori ( lebih sedikit
object String dibuat).
String StringBuffer
String a, b, c;
...
String message =
"a=" + a + "\n"
+ "b=" + b + "\n"
+ "c=" + c + "\n";
String a, b, c;
...
StringBuffer message = new StringBuffer(255);
message.append("a=");
message.append(a);
message.append("\n");
message.append("b=");
Pengembangan Perangkat Mobile 1
String StringBuffer
message.append(b);
message.append("\n");
message.append("c=");
message.append(c);
message.append("\n");
9.3.2 Gunakan clipping area dalam menggambar
Menggunakan Graphics.setClip() akan mengurangi waktu eksekusi karena Anda hanya akan
menggambar nomor-nomor yang optimal dari pixel-pixel di layar. Ingat, bahwa menggambar
grafik pada layar meminta banyak terminologi pada waktu eksekusi. Mengurangi banyaknya
pixel-pixel untuk digambar akan sangat mempengaruhi kinerja runtime program Anda.
Graphics g;
int x1, y1, x2, y2;
...
g.setClip(x1, y1, x2, y2);
g.drawString("JEDI", x, y, Graphics.TOP | Graphics.HCENTER);
// Operasi menggambar yang lainnya...
9.3.3 Hindari modifier yang sama
Menggunakan modifier yang sama mengambil sesuatu tanpa diduga pada kecepatan eksekusi
program Anda karena hal tersebut menimbulkan beberapa ukuran tambahan sehingga itu tidak
akan diakses secara bersamaan.
9.3.4 Lewatkan parameter sesedikit mungkin
Ketika memanggil suatu method, penerjemah akan mendorong semua parameter ke atas
tumpukan eksekusi. Melewatkan banyak parameter akan mempengaruhi kecepatan eksekusi
dan pemakaian Heap Memory.
9.3.5 Mengurangi pemanggilan method
Memanggil method menghabiskan Heap Memory dan waktu eksekusi. Lihat subbab
sebelumnya.
9.3.6 Menunda semua inisialisasi
Untuk mempercepat awal permulaan aplikasi, tunda semua inisialisasi yang sangat besar
sampai mereka dibutuhkan. Jangan meletakkan inisialisasi dalam konstruktor MIDlet atau
Pengembangan Perangkat Mobile 2
method startApp. Mempercepat waktu load sebuah aplikasi akan menambah penggunaan
aplikasi Anda. Kebanyakan user akan meninggalkan aplikasi ketika aplikasi tersebut
membutuhkan waktu yang lama untuk start up. Ingat bahwa waktu load aplikasi anda secara
langsung mempengaruhi kesan pertama pengguna aplikasi Anda.
9.3.7 Gunakan array sebagai pengganti collection
Mengakses Array lebih cepat daripada menggunakan vektor
9.3.8 Menggunakan variabel lokal
Hal tersebut lebih cepat mengakses variabel lokal daripada mengakses variabel instance.
9.4 Ukuran JAR
9.4.1 Gunakan Obfuscator
Tujuan utama obfuscator adalah untuk mengacak file class yang dikompile sehingga sulit
untuk di decompile. Tetapi proses obfuscator juga mengurangi ukuran sebuah aplikasi. Salah
satu method yang digunakan oleh obfuscator adalah memberi nama baru pada class menjadi
sebuah nama. Karena obfuscator melakukan hal ini berdasar kepada modifier dari method-
method. Jika method memiliki private atau protected modifier, lalu itu dapat diasumsikan
aman ketika method ini tidak akan digunakan oleh package lainnya dan oleh karena itu dapat
diberi nama baru kembali.
Netbeans Mobility Pack datang dengan satu obfuscator. Dia tidak diaktifkan sebagai default.
Buka tab property dan klik pada cabang “Obfuscating” :
Pengembangan Perangkat Mobile 3
Ada sepuluh tingkat obfuscation, dari tanpa obfuscation sampai ke obfuscation yang paling
agresif.
Pengembangan Perangkat Mobile 4
9.4.2 Memadatkan file JAR Anda
Pastikan bahwa sebelum mendistribusikan aplikasi Anda, Anda memampatkan file akhir JAR
untuk distribusi. Sebuah file JAR adalah sebuah arsip ZIP, dan suatu arsip ZIP mempunyai
beberapa tingkat tekanan (termasuk tanpa tekanan). NetBeans Mobility Pack tidak mendukung
tingkat tekanan.
Untuk mengatur pilihan tekanan JAR, buka halaman properti dari aplikasi dan pilih cabang
“Creating JAR”. Centang radio box “Compress JAR” untuk memampatkan file JAR proyek Anda.
Jangan lupa untuk membangun kembali proyek Anda.
Pengembangan Perangkat Mobile 5
9.4.3 Hindari membuat class yang tidak perlu
Ini akan tampak berlawanan untuk prinsip berorientasi object, tapi apakah Anda mengetahui
bahwa suatu class kosong yang sederhana seperti ini :
public class EmptyClass {
public EmptyClass(){}
}
akan dikompile menjadi file class dengan ukuran file sebesar 250kb (tanpa dimampatkan)?
Anda dapat mencoba mengkompile class kosong ini dan buktikan sendiri. Netbeans Mobility
Pack menyimpan package file JAR di dalam folder distribusi dibawah folder proyek. Anda dapat
merubah nama file .jar menjadi file .zip dan buka dengan program ZIP favorit Anda untuk
melihat ukuran dari file class yang Anda kompile.
9.4.4 Hindari membuat interfaces
Teknik ini berkaitan dengan teknik sebelumnya. Memiliki banyak class dan interfaces akan
menambahkan lebih ukuran file (kilobytes) dalam aplikasi Anda.
Pengembangan Perangkat Mobile 6
9.4.5 Hindari inner dan anonymous class
Sama seperti diatas. Inner class adalah semua class yang sama. Anonymous class mungkin
tidak memiliki nama, tetapi mereka mengambil ruang yang sama untuk definisi class.
9.4.6 Gunakan satu Listener untuk object yang ganda
Ini akan mengurangi banyaknya class dalam aplikasi Anda. Buatlah MIDlet Anda
mengimplementasikan CommandListener interface sehingga membantu anda memangkas
package Anda oleh satu class (Dimana mengurangi 250 + byte).
9.4.7 Gunakan package default (package tanpa nama)
Didalam permintaan kita untuk package berukuran kecil, memendekkan (atau tidak
menggunakan) nama package tersebut mendukung pengurangan byte.
9.4.8 Batasi penggunaan dari initializer static
Menggunakan inisialisasi static seperti ini :
int[] tones = { 64, 63, 65, 76, 45, 56, 44, 88 };
Akan dikompile oleh kompiler Java menjadi pernyataan berikut :
tones[0] = 64;
tones[1] = 63;
tones[2] = 65;
tones[3] = 76;
tones[4] = 45;
tones[5] = 56;
tones[6] = 44;
tones[7] = 88;
Contoh ini menggambarkan hanya delapan anggota array. Bayangkan jika inisialisasi ratusan
nilai menggunakan statemen terpisah. Hal tersebut akan menjadikan overhead pada ukuran
aplikasi Anda.
Sebagai salah satu alternatif, Anda dapat menggunakan method getResourceAsStream()
untuk mendapatkan nilai dari sebuah file atau menggunakan single string untuk menyimpan
nilai array Anda.
9.4.9 Menggabungkan gambar ke dalam satu file
Memampatkan gambar lebih baik ketika di-kelompokkan menjadi satu file gambar. Karena
memampatkan format gambar (contohnya PNG) adalah lebih spesifik untuk gambar daripada
memampatkan method pengarsipan JAR. Ada teknik-teknik untuk mendapatkan gambar yang
Pengembangan Perangkat Mobile 7
spesifik dari sebuah gambar yang besar yaitu dengan memotongnya.
9.4.10 Bereksperimen dengan memampatkan gambar
method tekanan(compressing) tidak diciptakan sama. Beberapa mungkin memampatkan lebih
baik pada beberapa jenis gambar tetapi kadang memiliki rasio yang rendah dalam
memampatkan jenis gambar yang lain. Pilih sebuah format gambar yang dapat meningkatkan
rasio pemampatan gambar Anda. Terkadang, rasio pemampatan juga dipengaruhi oleh
software pengolah gambar yang anda gunakan. Cobalah bereksperimen dengan berbagai
macam jenis software pengolah gambar untuk mendapatkan ukuran gambar yang lebih baik.
9.4.11 Gunakan class yang belum diinstal
Gunakan semua class yang bisa diterapkan yang tersedia pada platform yang anda gunakan.
Buatlah class Anda sendiri yang tidak akan menambah ukuran aplikasi Anda, tetapi juga
mengurangi stabilitas aplikasi Anda.
9.5 Jaringan
9.5.1 Gunakan thread yang terpisah
Gunakan thread yang terpisah untuk jaringan Anda yang berfungsi untuk menghindari screen
lockups.
9.5.2 Memampatkan data jaringan
Menggunakan data yang dimampatkan untuk mengurangi lalu lintas jaringan dari aplikasi
Anda. Hal ini akan membutuhkan client dan server Anda untuk menggunakan protokol dan
method pemampatan yang sama.
Memampatkan XML akan memberikan rasio yang lebih baik karena data XML terwakili dalam
suatu format teks.
9.5.3 Mengurangi lalu lintas jaringan
Karena komunikasi jaringan semakin lambat dan mahal, cobalah sebisa mungkin untuk
memasukkan beberapa perintah kedalam satu permintaan jaringan. Ini akan mengurangi
overhead yang dikenakan oleh protokol jaringan.
9.6 Penggunaan Memori
9.6.1 Gunakan struktur data ringkas
Gunakan struktur data memory yang sering digunakan. Array jarang bisa diwakili dengan cara
lain tanpa mengkonsumsi jumlah yang sama dari memory.
Ada tradeoff ketika mengoptimalkan untuk ukuran dan kecepatan. Menggunakan struktur data
komplek akan mempengaruhi kecepatan eksekusi program Anda.
Pengembangan Perangkat Mobile 8
9.6.2 Membebaskan object yang tidak terpakai untuk garbage
collection
Membebaskan object yang tak terpakai untuk garbage collection layar, koneksi jaringan,
rekaman RMS. Menentukan variabel untuk menunjuk kepada object yang tak terpakai menjadi
null dan akan memberi isyarat kepada garbage collector bahwa object ini aman untuk tidak di-
load dari memory.
9.6.3 Jangan sering menggunakan layar on-the-fly
Tidak sering menggunakan object Screen (seperti Help dan about screen)on-the-fly akan
banyak bebaskan banyak kebutuhan Anda yang menumpuk pada memory. Meski Anda harus
membayar harga yaitu loading yang lambat untuk screen tertentu. Layar ini akan diduga
menimbun pada heap memory sementara mereka tidak digunakan untuk membantu dalam
penghematan memory
public void commandAction(Command c, Displayable d) {
if (c == helpCommand) {
display.setCurrent(new HelpForm());
}
}
Web Services
Diakhir pembahasan, diharapkan siswa dapat :
• Mengetahui bagaimana memodelkan data menggunakan XML
• Mengetahui beberapa Java API yang digunakan dalam pemrosesan XML
• Mendeskripsikan apa yang bisa dilaksanakan oleh web service
• Mengetahui beberapa key standard dalam web service
• Mengetahui bagaiamana membuat web service mobile sebagai client
8.2 Pengenalan terhadap XML
XML (eXtensible Markup Language) adalah sebuah meta-language untuk
mendeskripsikan data. XML merupakan sebuah cara merepresentasikan data tanpa
tergantung kepada system. Ia juga dapat digunakan sebagai extension markup
languages. XML adalah berbasis text, sehingga ia dapat dengan mudah dipindahkan dari
satu sistem komputer ke sistem yang lain. Dengan XML, data direpresentasikan dalam
sebuah dokumen yang terstruktur dan ia juga telah menjadi sebuah standard industri.
Element
Sebuah dokumen XML adalah sebuah dokumen yang mudah dibaca dan terdiri dari XML
tag atau element. Sama halnya dengan HTML, XML tag didefinisikan dengan kurung siku
<>. Sebuah dokumen XML memiliki struktur seperti entities didalam sebuah tree.
Anda dapat menggunakan tag sesuai dengan yang Anda inginkan, selama semua aplikasi
yang menggunakan dokumen tersebut menggunakan tag dengan nama yang sama. Tag
dapat memiliki attributes. Dalam contoh dibawah ini, “task” pertama memiliki “id”
dengan attribut “1”, sedangkan “task” yang kedua memiliki “id” dengan attribute “2”.
<tasks>
<task id="1">
Pengembangan Perangkat Mobile 1
<name>connect to database</name>
<duration>2</duration>
<assignedTo>alex</assignedTo>
<progress>50</progress>
</task>
<task id="2">
<name>list table rows</name>
<duration>4</duration>
<assignedTo>alex</assignedTo>
<progress>100</progress>
</task>
</tasks>
Attributes
Tag dapat juga terdiri dari attribute-attribute. Didalam contoh, tag “task” memiliki
attribute dengan nama “id”. Sebuah attribut diikuti dengan tanda sama dengan (=) dan
diikuti dengan value atau nilainya.
Pada saat mendesai sebuah struktur XML, permasalahan yang selalu muncul adalah
apakah sebuah data element harus menjadi attribute dari sebuah element atau menjadi
sebuah sub-element. Seperti contoh, XML diatas juga dapat kita tulis lagi sebagai
berikut:
<tasks>
<task>
<id>1</id>
<name>connect to database</name>
...
</tasks>
Tidak ada aturan yang pasti, struktur element seperti apa yang harus kita anut. Akan
tetapi dalam beberapa situasi, aturan-aturan dibawah ini harus dipenuhi:
• Data akan memiliki beberap sub-struktur, pada kasus dimana Anda harus
menggunakan sebuah sub-element karena ia tidak boleh dimodelkan sebagai attribut.
• Data akan terdiri dari beberapa baris apabila attribut ingin dibuat sesederhana
mungkin – sebuah string yang pendek tetapi mudah untuk dibaca dan digunakan.
Pengembangan Perangkat Mobile 2
• Data element dimungkinkan untuk muncul kembali.
• Data akan sering berubah.
XML Schema
XML tag harus bersifat extensible, dimana seorang desainer system dimungkinkan untuk
menuliskan sendiri XML tag-nya dalam pendeskripsian sebuah content. Anda dapat
menciptakan tag-tag yang berbeda untuk setiap format dokumen yang Anda inginkan
didalam aplikasi atau sistem Anda.
Tag didefinisikan menggunakan XML schema language. Sebuah schema mendefinisikan
struktur dari dokumen XML. Sebuah skema juga digunakan membatasi content dari
sebuah dokumen XML kedalam sebuah element, attributes, dan values tertentu.
Sebuah Document Type Definition schema adalah bagian dari spesifikasi XML. Kita akan
memanggil schema yang ditulis dalam bahasa ini disebut sebagai DTD. DTD ini juga
mendefinisikan tag atau attribute mana yang sangat diperlukan dan mana yang bersifat
optional.
<!ELEMENT tasks (task)*>
<!ELEMENT task (name, duration, assignedTo, progress) >
<!ATTLIST task
id CDATA #REQUIRED
>
<!ELEMENT task (name, duration, assignedTo, progress) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT duration (#PCDATA) >
<!ELEMENT assignedTo (#PCDATA) >
<!ELEMENT progress (#PCDATA) >
Namespace
Ada beberapa kasus dimana tag atau element Anda memiliki nama yang sama. Misalnya, ada
beberapa element yang mempunya nama yang sama yaitu “name”. Untuk mengatasi hal tersebut,
sebuah namespace digunakan. Spesifikasi dari namespace akan digunakan oleh penulis
dokumentasi untuk mengetahui schema atau DTD mana yang digunakan pada element tertentu.
Namespace dapat diaplikasikan pada attribut dan juga pada elements.
Pengembangan Perangkat Mobile 3
8.3 Java APIs bagi XML
JAXP
JAXP atau Java API for XML Processing (JAXP) adalah sebuah fleksible API yang
mendukung Anda untuk mendukung sembarang XML-complient parser didalam aplikasi
Java Anda. Ia memiliki sebuah layer plugability, dimana Anda dapat menambahkan
sembarang implementasi dari SAX atau DOM APIs.
JAXP juga telah mendukung namespaces, sehingga ia akan mendukung Anda untuk
bekerja dengan schema XML dalam mengatasi permasalahan penamaan.
DOM API
Document Object Model (DOM) adalah sebuah struktur tree, dimana tiap node akan
terdiri dari sebuah komponen dari struktur XML. DOM API mendukung Anda untuk
membuat atau menghilangkan sebuah node didalam tree. Ia juga dapat digunakan
untuk mengganti content dari node dan mengubah hierarki node.
Oleh karena, sebuah tree me-representasikan keseluruhan XML data, DOM API
membutuhkan banyak memori didalam runtime-nya.
SAX API
Simple API for XML (SAX) adalah sebuah event-based XML parser API. Ia akan membaca
XML dokumen dari awal hingga akhir. Setiap saat bertemu dengan sebuah construction
syntax, ia akan memberikan tanda (notify) untuk menjalankan program tersebut.
Sebuah SAX parser akan memberikan tanda kepada aplikasi dengan jalan memanggil
method dari interface ContentHandler.
Sebagai contoh, pada saat parser mencapai simbol kurang dari (<), ia akan memanggil
method startElement. Pada saat bertemu dengan tag terakhir (sebuah slash yang diikuti
dengan tanda lebih besar dari), hal ini disebut method endElement.
SAX sangatlah cepat dan efisien. Ia membutuhkan memori yang lebih sedikit daripada
DOM, karena ia tidak mengharuskan untuk membuat sebuah struktur tree internal dari
data-data XML. SAX hanya akan mengirimkan data setiap kali aplikasi ingin membaca
data tersebut.
XLST API
Pengembangan Perangkat Mobile 4
Extensible Stylesheet Language Transformation (XSLT) standard mendefinisikan
mekanisme untuk pengalamatan (addressing) data-data XML dan untuk menspesifikkan
transformasi data.
Extensible Stylesheet Language (XSL) memiliki tiga sub-komponen:
XSL-FO – Formatting Objects standard. XSL-FO adalah sebuah standard yang
menyediakan mekanisme untuk mendeskripsikan aspek-aspek dari sebuah object
misalnya ukuran huruf dan layout halaman. Sub komponen ini tidak tercover didalam
JAXP.
XSLT – adalah sebuah transformation language dimana Anda diharapkan dapat
mendefisinikan sendiri transformasi dari sebuah XML ke format yang lain seperti HTML.
Xpath – adalah sebuah language spesification, dimana Anda diharapkan dapat
menspesifikasikan sendiri bagian-bagian dari struktur XML yang direference setiap saat.
Xpath adalah sebuah mekanisme pengalamatan yang mendukung Anda untuk
mendefinisikan sebuah path kepada element.
JAX-RPC
Java API for XML-based RPC (JAX-RPC) adalah sebuah teknologi untuk membangun web
services dan client web service yang dapat mengaktifkan remote procedure calls (RPC).
RPC model mendukung client untuk mengeksekusi procedure pada remote system.
Didalam JAX-RPC, remote procedure calls dan hasilnya direpresentasikan pada protocol
berbasis XML. SOAP adalah salah satu protokol yang menggunakan JAX-RPC. JAX-RPC
akan meng-convert API pemanggilan dan beraksi dari dan untuk SOAP/XML messages.
Hal ini akan menyebabkan SOAP menjadi lebih mudah dan menghilangkan
kekompleksan.
8.4 Web Services
Web Services Messaging
W3C mendefinisikan web service sebgai “sebuah software aplikasi yang dapat
teridentifikasi oleh URI dan memiliki interface yang didefiniskan, dideskripsikan, dan
dimengerti oleh XML dan juga mendukung interaksi langsung dengan software aplikasi
yang lain dengan menggunakan message berbasis XML melalui protokol internet”
Pengembangan Perangkat Mobile 5
Web service adalah sebuah sofware aplikasi yang tidak terpengaruh oleh platform, ia
akan menyediakan method-method yang dapat diakses oleh network. Ia juga akan
menggunakan XML untuk pertukaran data, khususnya pada dua entities bisnis yang
berbeda.
Beberapa karakteristik dari web service adalah:
− Message-based
− Standards-based
− Programming language independent
− Platform-neutral
Beberapa key standard didalam web service adalah: XML, SOAP, WSDL and UDDI.
SOAP (Simple Object Access Protocol) adalah sebuah XML-based mark-up language
untuk pergantian pesan diantara aplikasi-aplikasi. SOAP berguna seperti sebuah amplop
yang digunakan untuk pertukaran data object didalam network. SOAP mendefinisikan
empat aspek didalam komunikasi: Message envelope, Encoding, RPC call convention,
dan bagaimana menyatukan sebuah message didalam protokol transport.
Sebuah SOAP message terdiri dari SOAP Envelop dan bisa terdiri dari attachments atau
tidak memiliki attachment. SOAP envelop tersusun dari SOAP header dan SOAP body,
sedangkan SOAP attachment membolehkan non-XML data untuk dimasukkan kedalam
SOAP message, di-encoded, dan diletakkan kedalam SOAP message dengan
menggunakan MIME-multipart.
Web Services Description
WSDL (Web Services Description Language) adalah sebuah XML-based language untuk
mendeskripsikan XML. Ia menyediakan service yang mendeskripsikan service request
dengan menggunakan protokol-protokol yang berbeda dan juga encoding. Ia akan
memfasilitasi komunikasi antar aplikasi. WSDL akan mendeskripsikan apa yang akan
dilakukan oleh web service, bagaimana menemukannya dan bagaimana untuk
mengoperasikannya.
Spesifikasi WSDL mendefinisikan tujuh tipe element:
− Types – element untuk mendefinisikan tipe data. Mereka akan
mendefinisikan tipe data (seperti string atau integer) dari element didalam
sebuah message.
− Message - abstract, pendefinisian tipe data yang akan dikomunikasikan.
− Operation – sebuah deskripsi abstract dari sebuah action yang didukung
oleh service.
Pengembangan Perangkat Mobile 6
− Port Type – sebuah koleksi abstract dari operations yang didukung oleh
lebih dari satu endpoints.
− Binding – mendefinisikan penyatuan dari tipe port (koleksi dari operasi-
operasi) menjadi sebuah protokol transport dan data format (ex. SOAP
1.1 pada HTTP). Ini adalah sebuah protokol konkret dan sebuah
spesifikasi data format didalam tipe port tertentu.
− Port – mendefinisikan sebuah komunikasi endpoint sebagai kombinasi dari
binding dan alamat network. Bagi protokol HTTP, ini adalah sebuah bentuk
dari URL sedangkan bagi protokol SMTP, ini adalah sebuah form dari email
address.
− Service – satu set port yang terkorelasi atau suatu endpoints.
WSDL mendefinisikan service sebagai sebuah koleksi dari endpoints network. Sebuah
definisi abstrak dari endpoints dan messages adalah ia bersifat terpisah dari
pembangunan network atau penyatuan data format. Pembagian ini menyebabkan
penggunaan kembali abstract description dari data yang akan dipertukarkan (message
exchange) dan abstract collection dari operasi (ports)
Protokol konkret dan spesfikasi data format bagi tipe port tertentu menentukan binding
yang dapat digunakan kembali(reusable). Sebuah port adalah sebuah network address
yang dikombinasikan reusable binding; sebuah service adalah koleksi dari port-port.
Web Service Discovery
UDDI (Universal Description, Discovery and Integration) adalah sebuah service registry
bagi pengalokasian web service. UDDI mengkombinasikan SOAP dan WSDL untuk
pembentukan sebuah registry API bagi pendaftaran dan pengenalan service. Ia
menyediakan sebuah area umum dimana sebuah organisasi dapat mengiklankan
keberadaan mereka dan service yang mereka berikan (web service).
UDDI adalah sebuah framework yang mendefinisikan sebuah XML-based registry dimana
sebuah organisasi dapat meng-upload informasi mengenai service yang mereka berikan.
XML-based registry berisi nama-nama dari organisasi tsb, beserta service dan deskripsi
dari service yang mereka berikan.
Pengembangan Perangkat Mobile 7
8.5 J2ME Web Services API (WSA)
Web Services API(JSR 172) menyediakan fungsi-fungsi tambahan yang mendukung web
service. API ini berisi fungsi-fungsi dasar yang digunakan dalam web service client
seperti remote web invocation dan XML parsing. WSA hanya merupakan subset dari
J2SE API.
WSA hanya mendukung pemakaian dari web service. Hal ini berarti, aplikasi J2ME
dengan menggunakan WSA hanya dapat menjadi konsumen dari service dan bukan
merupakan producer service. UDDI juga tidak disupport oleh JSR 172.
JAXP subset disupport oleh WSA spesification yang didukung oleh SAX. Ia tidak berisi
dukungan bagi DOM dan XSLT.
Dokumen parsing XML menggunakan SAX
Untuk mendapatkan instance dari SAX Parser, pertama-tama kita harus mendapatkan
instance dari SAXParserFactory:
// Dapatkan instance dari SAX parser factory
SAXParserFactory factory = SAXParserFactory.newInstance();
Kemudian, kita akan mendapatkan instance dari SAX Parser:
SAXParser parser = factory.newSAXParser();
Pada akhirnya, kita akan membuat sebuah source input dan menggunakan event
handler untuk mem-parser. Untuk mempermudah contoh, kita akan membuat sebuah
stream dari sebuah String. Biasanya, hal ini bisa terlaksana dengan menggunakan
resource dari file atau network. Contoh yang kita buat juga tidak memiliki sebuah GUI-
ia hanya mencetak sebuah outcome dari sebuah parsing menjadi sebuah standard
output.
ByteArrayInputStream stream =
new ByteArrayInputStream(sampleXML.getBytes());
InputSource inputSource = new InputSource(stream);
SaxEventHandler handler = new SaxEventHandler();
parser.parse(inputSource, handler);
Kode berikut ini adalah kode untuk Event Handler:
Pengembangan Perangkat Mobile 8
import java.util.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class SaxEventHandler extends DefaultHandler {
private boolean finished;
private Stack qNameStack = new Stack();
private Vector tasks = new Vector();
private static final String TASKS_ELEMENT = "tasks";
private static final String TASK_ELEMENT = "task";
private static final String NAME_ELEMENT = "name";
private static final String ID_ATTRIBUTE= "id";
public void startDocument() throws SAXException {
finished = false;
qNameStack.removeAllElements();
tasks.removeAllElements();
}
public void endDocument()
throws SAXException {
finished = true;
// Akhir dari dokumen, sekarang lakukan proses untuk memparsing object
for (int i=0; i<tasks.size(); i++) {
Task task = (Task) tasks.elementAt(i);
System.out.println("Task: " + task.name);
}
}
public void startElement(
String uri,
String localName,
String qName,
Attributes attributes)
throws SAXException {
if (TASK_ELEMENT.equals(qName)) {
// Dapatkan id attribute dari sebuah task
String id = attributes.getValue(ID_ATTRIBUTE);
Pengembangan Perangkat Mobile 9
Task task = new Task(id);
tasks.addElement(task);
}
qNameStack.push(qName);
}
public void characters(
char[] ch,
int start,
int length)
throws SAXException {
String name = new String(ch, start, length);
String qName = (String) qNameStack.peek();
if (NAME_ELEMENT.equals(qName)) {
if (tasks.size() > 0) {
Task task = (Task) tasks.lastElement();
task.name = name;
}
}
}
public void endElement(
String uri,
String localName,
String qName)
throws SAXException {
qNameStack.pop();
}
}
Pengembangan Perangkat Mobile 10
8.6 Membuat sebuah Mobile Web Service Client
Kita akan membuat secara sederhana aplikasi mobile dan kita akan menamakannya
“arithmeticClient”.
Pengembangan Perangkat Mobile 11
Kemudian, kita akan menggunakan stub generator (Tools->Java Platform Manager ->
Wireless Toolkit -> Tools and Extensions -> Open Utilities -> Stub Generator):
Pengembangan Perangkat Mobile 12
Sebelum kita dapat membuat sebuah web service client, kita harus memiliki sebuah file
WSDL atau lokasi URL dimana terdapat service yang dapat kita pergunakan. Seperti
yang telah disebutkan dalam bagian sebelumnya, JSR 172 tidak mendukung UDDI atau
automatic discovery bagi service.
Masukkan lokasi WSDL dari sebuah web service. Path dari outputnya harus menjadi path
dari direktori sumber project Anda (PROJECT_PATH/src). Sebuah stub generator tidak
menerima package tanpa penamaan. Oleh karena itu, Anda harus meng-inputkan
sebuah nama package.
Pengembangan Perangkat Mobile 13
Kemudian, kita akan membuat sebuah Midlet yang akan menggunakan stub yang telah
kita buat untuk mengakses sebuah web service:
/*
* arithemeticClient.java
*
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import jedi.*;
public class WSClient extends MIDlet {
private ArithmeticSEI_Stub stub;
public void startApp() {
System.out.println("Creating stub...");
stub = new ArithmeticSEI_Stub();
System.out.println("Invoking operation...");
WebServiceClient client = new WebServiceClient();
Thread thread = new Thread(client);
thread.start();
Pengembangan Perangkat Mobile 14
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
class WebServiceClient implements Runnable {
public void run() {
try {
int reply = stub.multiply(4, 5);
System.out.println("Reply: " + reply);
} catch (java.rmi.RemoteException rex) {
System.out.println("Remote Exception: " + rex.getMessage());
}
}
}
}