Retrofit 2.0 (Beta) with UEC API

[Retrofit အကြောင်း Introduction ကို ဒီမှာ အရင် ဖတ်နိုင်ပါတယ်]

REST API တွေနဲ့ တွဲသုံးလေ့ရှိတဲ့ Retrofit library 2.0 beta အနေနဲ့ ထွက်လာပါပြီ။

အခုလက်ရှိ 1.* version နဲ့ major changes တွေ ကွာသွားတာ ရှိပါတယ်။ 2.0 Stable မထွက်ခင်အထိလည်း ကွာခြားမှုတွေ ရှိနေဦးမှာ ဖြစ်ပါတယ်။ အသ​ေးစိတ်အကြောင်းကို Jake Wharton က DroidCon NYC 2015 မှာ ပြောသွားတာ ရှိပါတယ်။ Presentation Slide ကို အောက်မှာ ကြည့်နိုင်ပါတယ်။

ဘာတွေ ကွာခြားသွားလဲ အသစ်တွေ ပါလာသလဲဆိုတာကို Union Election Committee (UEC) ရဲ့ Check Voterlist API နဲ့ sample app လေး တစ်ခုလောက် ရေးကြည့်ရအောင်ပါ။

ပထမဆုံး Android Studio (or IntelliJ) မှာ project တစ်ခု Create လုပ်ပါမယ်။ Package Name ကို ကိုယ့်စိတ်ကြိုက်ပေးလို့ရပါတယ်။ ပြီးရင်တော့ ပုံမှန် Blank Activity တစ်ခုကို ယူပါ။

app အောက်က build.gradle ရဲ့ dependencies tag တွေမှာ အခုလို dependencies တွေထည့်ပါတယ်။

dependencies {  
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile 'com.android.support:appcompat-v7:23.0.1'
  compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
  compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'
  compile 'com.squareup.okhttp:okhttp:2.5.0'
}

minSdkVersion ၉ လောက်အထိ support လုပ်ချင်တာ ဖြစ်တဲ့အတွက် support:appcompat library ကို သုံးပါတယ်။

Retrofit ကတော့ beta ဖြစ်တဲ့အတွက် 1* version နဲ့ package name အတူတူ version ပဲ ကွာသွားပါတယ်။ ကျန်တဲ့ dependencies တွေကို အောက်မှာ ရှင်းပြသွားပါမယ်။

UEC API ကို ပြန်ကြည့်မယ်ဆိုရင် GET request ကို URL Parameter တွေထည့်ပြီး request လုပ်ရပါတယ်။ ဥပမာ - vote_name နဲ့ dateofbirth နဲ့ request လုပ်မယ်ဆိုရင် အခုလို လုပ်ပါတယ်။

https://checkvoterlist.uecmyanmar.org/api/?voter_name=အောင်ဆန်းစုကြည်&dateofbirth=1945-06-19  

Response ကတော့ JSON format အနေနဲ့ဖြစ်ပြီး အခုလို မြင်ရမှာဖြစ်ပါတယ်။

{
    "dateofbirth": "၁၉-๐၆-၁၉၄၅",
    "village": "ရွှေတောင်ကြား(၁)ရပ်ကွက်",
    "father_name": "ဦးအောင်ဆန်း",
    "nrcno": "၁၂/ဗဟန(နိုင်)၁၀၉၄၅၈",
    "state": "ရန်ကုန်တိုင်းဒေသကြီး",
    "voter_name": "ဒေါ်အောင်ဆန်းစုကြည်",
    "dateofbirth_num": "19-06-1945",
    "mother_name": "ဒေါ်ခင်ကြည်",
    "township": "ဗဟန်း",
    "district": "ရန်ကုန်အနောက်ပိုင်းခရိုင်"
}

ပထမဆုံး Voter လို့ခေါ်တဲ့ Class တစ်ခုကို အောက်က Attributes တွေနဲ့ Create လုပ်ပါတယ်။

ဒီနေရာမှာ @SerializedName ဆိုတဲ့ Annotation အကြောင်းကို နည်းနည်းလေး ပြောဖို့လိုပါတယ်။ Retrofit က Gson လို့ခေါ်တဲ့ Java object တွေကို JSON အနေနဲ့ (သို့မဟုတ် အပြန်အလှန်) Serialize လုပ်ပေးနိုင်တဲ့ library ကို သုံးတာရှိပါတယ်။

GSON documentation မှာတော့ အခုလို ရေးထားပါတယ်။

An annotation that indicates this member should be serialized to JSON with the provided name value as its field name.

Java Object ထဲက @SeraializeName ထဲမှာ ရှိတဲ့ name အတိုင်း JSON field ကို serialize လုပ်မယ်လို့ မှတ်ထားပေးတာပါ။

ပြီးရင်တော့ CheckVoterService ဆိုတဲ့ interface တစ်ခု ရေးပါတယ်။

Retrofit 1.9 မှာ Asynchronous နဲ့ Synchronous call တွေကို အခုလို ခေါ်ပါတယ်။

2.0 မှာတော့ Call<T> နဲ့ နှစ်မျိုးလုံးကို အောက်ကလို ခေါ်ပါတယ်။
ဒီနေရာမှာ Retrofit 1.* နဲ့ကွာသွားတဲ့အချက်ကို တွေ့မှာပါ။

ဒီနည်းဟာ OkHttp မှာလိုမျိုး request တွေကိုခေါ်သလိုပါပဲ။

နောက်တစ်ဆင့်ကတော့ 1.9 မှာဆိုရင် RestAdapter လုပ်တဲ့အဆင့်ပါ။ 2.0 မှာ RestAdapter ကို Retrofit ဆိုပြီး အမည်ပြောင်းထားပါတယ်။

နောက်တစ်ချက်က 1.9 မှာဆိုရင် response body ကို Gson နဲ့ parse လုပ်ပြီး Java object အနေနဲ့ ထွက်လာပါတယ်။ 2.0 မှာတော့ built-in မပါတော့ပဲ Gson ကို external dependency အနေနဲ့ ထည့်ပေးရပါတယ်။ အဲဒါကြောင့်အပေါ်မှာ compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1' ဆိုပြီး ထည့်ခဲ့တာ ဖြစ်ပါတယ်။

Official support လုပ်တဲ့ converter တွေကတော့ အောက်က အတိုင်းပါ

Gson: com.squareup.retrofit:converter-gson  
Jackson: com.squareup.retrofit:converter-jackson  
Moshi: com.squareup.retrofit:converter-moshi  
Protobuf: com.squareup.retrofit:converter-protobuf  
Wire: com.squareup.retrofit:converter-wire  
Simple XML: com.squareup.retrofit:converter-simplexml  

ဆိုတော့ Retrofit ကို အခုလို Gson converter configuration နဲ့ create လုပ်ပါတယ်။

( အရင် RestAdapter မှာပါတဲ့ setLogLevel လို method တွေတော့ beta မှာ မပါသေးပါဘူး။ stable ထွက်တဲ့အခါမှာ ပါလာမှာပါ။ )

Black Activity အသစ်လုပ်ထားတယ်ဆိုရင် main_activity.xml layout ထဲမှာ TextView တစ်ခုကို အသစ်လုပ်ပါတယ်။ ရှိပြီးသားဆိုရင် android:id ကို result လို့ပေးရုံပါပဲ။

Layout အဆင်သင့်ဖြစ်ပြီဆိုရင် လိုအပ်တဲ့ URL Parameter တွေကို ထည့်ပြီး request လုပ်ပါတယ်။

ဒီနေရာမှာ enqueue နဲ့ ခေါ်တာမို့ request ဟာ Asynchronous ဖြစ်ပါတယ်။ ဒီအတိုင်းပဲ UI Thread ပေါ်မှာ ခေါ်လိုက်လို့ရပါတယ်။

Synchronous ခေါ်တယ်ဆိုရင်တော့ voterCall.execute(); လို့ခေါ်ပါတယ်။ ဒီနေရာမှာ သတိထားရမှာက Synchronous call တွေကို အသုံးပြုမယ်ဆိုရင် AsyncTask လိုဟာမျိုးနဲ့ ခေါ်ရမှာဖြစ်ပါတယ်။ မဟုတ်ရင်တော့ NetworkOnMainThreadException တက်လာမှာဖြစ်ပါတယ်။

အဲ AndroidManifest.xml မှာ Internet permission ထည့်ဖို့လည်း မမေ့ပါနဲ့။ 😉

Run ကြည့်မယ်ဆိုရင်တော့ အခုလို မြင်ရမှာဖြစ်ပါတယ်။

App တစ်ခုလုံးရဲ့ Sample app ကို GitHub မှာ ကြည့်လို့ရပါတယ်။

References :