Showing posts with label sony. Show all posts
Showing posts with label sony. Show all posts

Saturday, December 16, 2017

Menampilkan Data pada RecyclerView Android menggunakan FastAdapter

Untuk post saya kali ini, saya akan menjelaskan tentang FastAdapter.Sebelum saya membahas FastAdapter, saya akan menjelaskan apa itu RecyclerView.RecyclerView adalah versi yang lebih canggih dari ListView, yang berfungsi untuk menampilkan kumpulan data besar dengan sangat efisien.Sedangkan apa itu FastAdapter? FastAdapter adalah salah 1 library buatan mikepenz yang sangat berguna untuk membuat proses menulis data ke RecyclerView lebih mudah.

Oke, tanpa panjang lebar kita akan langsung menuju contoh kodenya.

Langkah pertama adalah kita masukin gradle FastAdapter ke dalam projek

 // https://mvnrepository.com/artifact/com.mikepenz/fastadapter  
 compile group: 'com.mikepenz', name: 'fastadapter', version: '3.0.4'  
 // https://mvnrepository.com/artifact/com.mikepenz/fastadapter-commons  
 compile group: 'com.mikepenz', name: 'fastadapter-commons', version: '3.0.3'  

Oh iya, karena untuk contoh kita kali ini kia menggunakan butterknife, kita akan tambahkan gradle butterknife ke projek ini

 compile 'com.jakewharton:butterknife:8.8.1'  
 annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'  

Dan 1 lagi, karena kita juga bermain dengan library dari mikepenz yang lain, kita tambahkan juga gradle :

 // https://mvnrepository.com/artifact/com.mikepenz/materialdrawer  
 compile group: 'com.mikepenz', name: 'materialdrawer', version: '6.0.0'  

Langkah berikutnya kita buat file idx.xml di folder res

 <?xml version="1.0" encoding="utf-8"?>  
 <resources>  
   <item name="member_id" type="id" />  
 </resources>  

Kemudian kita buat modelnya, untuk kasus ini kita buat kelas Member.java

 public class Member extends AbstractItem<Member, Member.ViewHolder> {  
   private String uid;  
   private String name;  
   public Member(String uid, String name) {  
     this.uid = uid;  
     this.name = name;  
   }  
   public String getUid() {  
     return uid;  
   }  
   public String getName() {  
     return name;  
   }  
   @Override  
   public ViewHolder getViewHolder(View v) {  
     return new ViewHolder(v);  
   }  
   @Override  
   public int getType() {  
     return R.id.member_id;  
   }  
   @Override  
   public int getLayoutRes() {  
     return R.layout.adapter_member;  
   }  
   protected static class ViewHolder extends RecyclerView.ViewHolder {  
     @BindView(R.id.id)  
     AppCompatTextView id;  
     @BindView(R.id.name)  
     AppCompatTextView name;  
     public ViewHolder(View itemView) {  
       super(itemView);  
       ButterKnife.bind(this, itemView);  
     }  
   }  
   @Override  
   public void bindView(ViewHolder holder, List<Object> payloads) {  
     super.bindView(holder, payloads);  
     StringHolder.applyTo(new StringHolder(getUid()), holder.id);  
     StringHolder.applyTo(new StringHolder(getName()), holder.name);  
   }  
   @Override  
   public void unbindView(ViewHolder holder) {  
     super.unbindView(holder);  
     holder.id.setText(null);  
     holder.name.setText(null);  
   }  
 }  

Wait...what? Kenapa di dalam objeknya extends AbstractItem? Di sini lah perbedaannya, jika menggunakan Adapter RecyclerView seperti biasanya, akan 2 kelas yang dibuat yaitu Recylerview Adapter dan modelnya. Kalau menggunakan FastAdapter maka kelas modelnya akan menjadi 1 dengan adapternya.

Untuk pemanggilan adapternya adalah seperti ini :

 public class MainActivity extends AppCompatActivity {  
   @BindView(R.id.member_list)  
   RecyclerView memberList;  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_main);  
     ButterKnife.bind(this);  
     FastItemAdapter<Member> memberAdapter = new FastItemAdapter<>();  
     memberList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));  
     memberList.setAdapter(memberAdapter);  
     memberList.setNestedScrollingEnabled(false);  
     memberAdapter.add(new Member("123", "Pelaku A"));  
     memberAdapter.add(new Member("456", "Pelaku B"));  
     memberAdapter.add(new Member("789", "Pelaku C"));  
   }  
 }  

Dan untuk hasilnya seperti ini :





































Lebih mudah dibandingkan cara biasa untuk menampilkan recylerview bukan?Karena itulah namanya FastAdapter :D

Sekian dari post saya kali ini.Jika ada kesalahan, mohon bantu untuk perbaikannya..he

Referensi :
https://github.com/mikepenz/FastAdapter

Pengenalan Vert.x

Untuk post saya kali ini, saya ingin mengenalkan sebuah toolkit di JVM yang sangat yahud bernama Vert.x.Yeay!

Apa itu Vert.x? Vert.x adalalah sebuah toolkit untuk membuat aplikasi yang reaktif di atas JVM. Kenapa dia dikatakan sebuah toolkit dan bukan sebuah framework?Karena dengan Vert.x bisa membuat sebuah asynchronous networked applications dan bisa menggunakan framework lain di aplikasi tersebut. Vert.x dibuat berdasarkan Netty project.

Vert.x juga bersifat polyglot yang dimana support berbagai macam bahasa yang berdiri di atas JVM. Contoh : Java, Groovy, Scala, Kotlin, JavaScript, Ruby and Ceylon. 

Banyak library dan framework networking bergantung pada threading yang sederhana: setiap klien jaringan diberi thread saat koneksi, dan thread ini berhubungan dengan klien sampai terputus. Ini adalah kasus Servlet atau kode jaringan yang ditulis menggunakan java.io dan java.net. Sementara model threading synchronous I/O ini memiliki keuntungan yang mudah dipahami, tapi tidak memiliki skalabilitasnya yang bagus.Karena dengan jumlah koneksi konkuren yang terlalu banyak, kernel sistem operasi dapat menghabiskan waktu yang cukup lama hanya pada manajemen penjadwalan thread. Sehingga dalam kasus seperti itu, kita perlu beralih ke asynchronous I / O dan Vert.x adalah sendiri menggunakan konsep asynchronous.

Oke, selanjutnya saya akan menuliskan sedikit kode yang sangat sangat dasar, yaitu membuat hello world dengan Vert.x.

Langkah pertama adalah import gradle dari vertx, yang bisa diambil dari :
https://mvnrepository.com/artifact/io.vertx

 // https://mvnrepository.com/artifact/io.vertx/vertx-core  
 compile group: 'io.vertx', name: 'vertx-core', version: '3.5.0'  

Langkah kedua, saatnya untuk mulai menulis kode. Kita buat kelas Java HelloWorldVertx

 public class HelloWorldVertx extends AbstractVerticle {  
   @Override  
   public void start(Future<Void> fut) {  
     Router router = Router.router(vertx);  
     router.get("/hello").handler(routingContext -> {  
       HttpServerResponse response = routingContext.response();  
       response  
           .putHeader("content-type", "text/html")  
           .end("Hello World!\nVert.x is GOOD!");  
     });  
     vertx.createHttpServer()  
         .requestHandler(router::accept)  
         .listen(  
             config().getInteger("http.port", 2227),  
             result -> {  
               if (result.succeeded()) {  
                 fut.complete();  
               } else {  
                 fut.fail(result.cause());  
               }  
             }  
         );  
   }  
 }  

Jika kita lihat, kelas tersebut extends ke AbstractVerticle. Untuk kelas HelloWorldVertx adalah verticle, yaitu unit deployment pada vert.x. Karena itu kita perlu extends ke kelas AbstractVerticle. Ada 2 hal yang harus diperhatikan dari kode di atas, yaitu :
  • Router : untuk menentukan url request yang diminta
  • RequestHandler : untuk memproses request dan mengolah hasilnya
Pada kelas diatas,  kode : router.get("/hello"), menunjukan kita mengatur urlnya ke /hello dan menggunakan method GET.

Langkah ketiga, kita deploy kelas HelloWorldVertx sehingga bisa dijalankan dari postman.Untuk mendeploynya, pada tutorial kali ini kita deploy secara programmatically. Kita akan buat kelas HelloRestVertx :

 public class HelloRestVertx {  
   public static void main(String[] args) {  
     caseVertxBasic();  
   }  
   private static void caseVertxBasic() {  
     Vertx vertx = Vertx.vertx();  
     vertx.deployVerticle(new HelloWorldVertx(), event -> System.out.println("HelloWorldVertx deployment complete"));  
   }  
 }  

Selamat. Hello World sudah jadi! Saatnya untuk menjalakankan kode tersebut dari IDE yang digunakan dan coba jalankan http://127.0.0.1:2227/hello di postman menggunakan GET.Jika kode tersebut berjalan dengan lancar tanpa halangan, maka akan jadi seperti ini :


Yeay! Hello world sudah berhasil ditampilkan, maka kita sudah melangkah 1 step untuk menguasai Vert.x.Tunggu postingan berikutnya untuk membahas lebih jauh tentang vert.x. Sekian dari post saya kali ini, jika ada kesalahan dari post saya mohon untuk koreksinya. :D

Referensi :
http://vertx.io/docs/guide-for-java-devs/

Sunday, September 17, 2017

Mengenal SnappyDB

Apa itu SnappyDB?

Menurut situs resminya, SnappyDB adalah :

SnappyDB is a key-value database for Android it's an alternative for SQLite if you want to use a NoSQL approach.
It allows you to store and get primitive types, but also a Serializable object or array in a type-safe way.
SnappyDB can outperform SQLite in read/write operations.
Dengan SnappyDB Anda dapat menyimpan dan mengambil objek / array Anda dengan cepat, karena SnappyDB menggunakan serialisasi Kryo yang lebih cepat daripada serialisasi Java biasa.

Kryo adalah framework serialisasi grafik objek yang cepat dan efisien untuk Java. 

Untuk penggunaan SnappyDB, cukup mudah.Pertama, kita tambahkan gradle SnappyDB ke dalam projek
 compile 'com.snappydb:snappydb-lib:0.5.2'  
 compile 'com.esotericsoftware.kryo:kryo:2.24.0'  
Kemudian untuk penggunaan codenya, bisa dilihat seperti ini :
 try {  
   DB snappydb = DBFactory.open(context); //create or open an existing databse using the default name  
   snappydb.put("name", "Jack Reacher");   
   snappydb.putInt("age", 42);   
   snappydb.putBoolean("single", true);  
   snappydb.put("books", new String[]{"One Shot", "Tripwire", "61 Hours"});   
   String  name  = snappydb.get("name");  
   int   age  = snappydb.getInt("age");  
   boolean single = snappydb.getBoolean("single");  
   String[] books = snappydb.getArray("books", String.class);// get array of string  
   snappydb.close();  
   } catch (SnappydbException e) {  
  }  
Sedangkan untuk penggunaan penyimpanan object, contohnya adalah seperti ini :
 Booking newBooking = new Booking(booking.getBookingId(), booking.getPlaceId(),  
         booking.getBookingDate(),  
         booking.getBookingPayment(),  
         booking.getBookingUserId());  
 snappydb .put(newBooking.getBookingId, newBooking);  
Untuk mendapatkan objek yang sudah disimpan :
 Booking booking = snappydb.get(key, Booking.class);  
Sekian dari blog singkat saya, semoga bermanfaat di kemudian hari.Semangat!

Jika ingin mempelajari lebih jauh tentang SnappyDB, bisa dilihat langsung di sini dan di sini

Saturday, September 16, 2017

Implementasi Dagger 2 Android Pada MVP

Implementasi Dagger 2 Android Pada MVP

Dagger adalah suatu mekanise untuk menerapkan Dependency Injection tanpa membuat penulisan kode menjadi  berulang – ulang, atau dengan kata lain untuk menyederhanakan Dependency Injection. Sedangkan menurut website nya :

Dagger is a fully static, compile-time dependency injection framework for both Java and Android. It is an adaptation of an earlier version created by Square and now maintained by Google.
Apa itu Dependency  Injection? Menurut Om Wikipedia :
Dependency Injection is a technique whereby one object supplies the dependencies of another object. A dependency is an object that can be used (a service). An injection is the passing of a dependency to a dependent object (a client) that would use it.
Fungsi dari Dependency Injection yaitu menginjeksi bagian-bagian tertentu dalam aplikasi sehingga dapat mempermudah mengatur flow sebuah program .

Contoh paling simple dari Dependency Injection, seperti ini :
 Luas luas = new Luas(4, 5);  
 Volume volume = new Volume(luas, 3);  
 int hitungVolume = volume.hitungVolume();  

Bisa dilihat bahwa untuk kelas Volume memerlukan sebuah kelas bernama Luas.Pada kasus ini kita "menyuntikan" kelas Luas ke kelas Volume, karena kelas Volume memiliki "ketergantungan" dengan kelas Luas.Seperti ini contoh sederhana dari dependency injection.

Sedangkan MVP itu sendiri adalah singkatan dari Model View Presenter.Apa itu MVP?Menurut Om Wikipedia :

MVP is a user interface architectural pattern engineered to facilitate automated unit testing and improve the separation of concerns in presentation logic :
  • The model is an interface defining the data to be displayed or otherwise acted upon in the user interface.
  • The view is a passive interface that displays data (the model) and routes user commands (events) to the presenter to act upon that data.
  • The presenter acts upon the model and the view. It retrieves data from repositories (the model), and formats it for display in the view.
Untuk lebih jelasnya, mungkin bisa dibantu dengan gambar ini :
Jadi bisa dilihat bahwa Presenter sebagai Mediator atau penghubung antara Model dengan View. Dimana Model sebagai Business Logic dan segala sesuatu yang berhubungan dengan data, contohnya query ke database lokal android, seperti Sqlite atau Realm. Sedangkan View untuk menampilkan output dari proses yang dihasilkan dari hasil hubungan antara Presenter dan Model, atau menerima inputan untuk diteruskan ke Presenter sehingga Presenter dan Model bisa berhubungan. Untuk lebih jelasnya bisa dilihat pada gambar di bawah ini :

Oke, selanjutnya kita kembali ke topic awal, yaitu Implementasi Dagger 2 pada Android.

Bumbu pertama yang akan kita siapkan di dalam gradle project kita adalah adalah :
 compile 'com.google.dagger:dagger:2.11'   
 annotationProcessor "com.google.dagger:dagger-compiler:2.11"  

 Untuk membantu memahami apa isinya Dagger, bisa dilihat di gambar ini :


Ada beberapa annotasi di dalam dagger yaitu :
  • @Module : kelas yang menyediakan dependencies
  • @Provides : method-method yang ada di kelas @Module
  • @Scope : anotasi Java untuk menginisialisasikan object yang akan diinjeksikan
  • @Inject : sebuah request dependency, bisa berupa construktor, method, maupun field
  • @Component : sebuah jembatan penghubung antara module dan injection.
Oke, sekarang kita akan coba untuk memasaknya.Dalam kasus ini, kita akan membuat sebuah kalkulator yang sangat sangat sederhana.

Pertama kita siapkan apa saja yang ingin kita provide ke dalam kelas Module.Di dalam kelas Module, kita akan mem-provide kelas - kelas apa saja yang ingin kita injeksikan. Contoh kelas Module adalah seperti ini :
 @Module  
 public class CalculatorModule {  
   private Application application;  
   public CalculatorModule(Application application) {  
     this.application = application;  
   }  
   @Provides  
   @Singleton  
   Application providesApplication() {  
     return application;  
   }  
   @Named("ApplicationContext")  
   @Provides  
   @Singleton  
   Context provideContext() {  
     return application;  
   }  
   @Provides  
   @Singleton  
   CalculatorUtil providesCalculatorUtil() {  
     return new CalculatorUtil();  
   }  
   @Provides  
   @Singleton  
   NotesModel providesNotesModel() {  
     return new NotesRepository();  
   }  
 }
Selanjutnya kita akan membuat kelas Component. Kelas Component ini berfungsi untuk menghubungkan antara module dan injection. Contohnya adalah seperti ini :
 @Singleton  
 @Component(modules = {CalculatorModule.class, PreferenceModule.class, RealmModule.class})  
 public interface CalculatorComponent {  
   void injectCalculatorActivity(CalculatorActivity activity);  
   void injectNotesActivity(NotesActivity activity);  
 }  
Kemudian kita akan "menyuntik" pada kontruktor kelas Presenter dan Model yang telaj kita siapkan.Yang pertama kita akan inject kelas Model. Contohnya :
 @Singleton  
 public class CalculatorRepository implements CalculatorModel {  
   private CalculatorUtil calculatorUtil;  
   private PreferenceManager preferenceManager;  
   @Inject  
   public CalculatorRepository(CalculatorUtil calculatorUtil,  
                 PreferenceManager preferenceManager) {  
     this.calculatorUtil = calculatorUtil;  
     this.preferenceManager = preferenceManager;  
   }  
 }  
Penjelasan untuk code di atas, kelas CalculatorUtil sudah kita provide di bagian atas :
 @Provides   
   @Singleton   
   CalculatorUtil providesCalculatorUtil() {   
    return new CalculatorUtil();   
   }   
Sedangkan kelas PreferenceManager, kita provide di dalam kelas PreferenceModule.Untuk isi dari kelas PreferenceModule adalah :
 @Module  
 public class PreferenceModule {  
   @Named("PreferenceInfo")  
   @Provides  
   @Singleton  
   String providePreferenceName() {  
     return "CalculatorPreference";  
   }  
   @Provides  
   @Singleton  
   PreferenceManager providePreferenceManager(@Named("ApplicationContext") Context context,  
                         @Named("PreferenceInfo") String preferenceName) {  
     return new PreferenceManager(context, preferenceName);  
   }  
 }  
Untuk isi kelas PreferenceManager :
 public class PreferenceManager {  
   private SharedPreferences sharedPreferences;  
   public PreferenceManager(Context context,  
                String preferenceName) {  
     sharedPreferences = context.getSharedPreferences(preferenceName, Context.MODE_PRIVATE);  
   }  
 }  
Selanjutnya kita akan menginject konstruktor pada Presenter, contohnya adalah seperti ini :
 public class CalculatorPresenter implements CalculatorContract.Presenter {  
   private CalculatorContract.View view;  
   private CalculatorModel model;  
   private PublishSubject<Calculator> calculatorSubject = PublishSubject.create();  
   private PublishSubject<String> resultSubject = PublishSubject.create();  
   @Inject  
   public CalculatorPresenter(CalculatorRepository model) {  
     this.model = model;  
   }  
 }  
Oke, persiapan sedikit lagi selesai. Sebelum kita menginjeksikan bahan - bahan yang telah kita siapkan, kita build dulu projek kita, supaya dagger bisa mengenerate kelas - kelas yang telah kita siapkan tadi. Dan jangan lupa berdoa supaya tidak gagal build. Salah 1 contoh gagal build adalah seperti ini (kasusnya method providesCalculatorUtil saya hapus dari Module di atas) :






Hal ini disebabkan jika CalculatorUtil belum di - provide di dalam kelas Module, sehingga dimarahin oleh Android Studio nya.

Jika build anda sukses, langkah selanjutnya adalah membuat kelas Injector dan memanggil kelas tersebut ke dalam kelas Application.
 public class Injector {  
   private CalculatorComponent appComponent;  
   private CalculatorComponent createComponent(Application application) {  
     return DaggerCalculatorComponent.builder()  
         .calculatorModule(new CalculatorModule(application))  
         .preferenceModule(new PreferenceModule())  
         .realmModule(new RealmModule())  
         .build();  
   }  
   public void setAppComponent(Application application) {  
     if (getAppComponent() == null) {  
       setAppComponent(createComponent(application));  
     }  
   }  
   public CalculatorComponent getAppComponent() {  
     return appComponent;  
   }  
   public void setAppComponent(CalculatorComponent appComponent) {  
     this.appComponent = appComponent;  
   }  
 }  

 public class DaggerApp extends Application {  
   private Injector injector;  
   @Override  
   public void onCreate() {  
     super.onCreate();  
     injector = new Injector();  
     injector.setAppComponent(this);  
   }  
   public Injector getInjector() {  
     return injector;  
   }  
 }  
Sekarang saatnya menginjeksikan ini semua ke dalam View. Untuk menginjeksikan ke dalam View, cukup mudah.Cukup deklarasikan variabelnya dan menambahkan annotasi @Inject.
 @Inject  
 CalculatorPresenter presenter;  
Dan tambahkan 
  ((DaggerApp) getApplication()).getInjector().getAppComponent().injectCalculatorActivity(this);  
Untuk lengkapnya seperti ini :
 @Inject  
 CalculatorPresenter presenter;  
   @Override  
   protected void onCreate(@Nullable Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     ((DaggerApp) getApplication()).getInjector().getAppComponent().injectCalculatorActivity(this);  
     setContentView(R.layout.activity_calculator);  
     presenter.setView(this);  
   }  
Selamat!Anda telah berhasil mengimplementasikan dagger 2 ke dalam MVP.Yeay!Cukup panjang jika dibaca?Ya...yang ngetik juga capek soalnya.. :D

Semoga apa yang saya share bisa berguna di kemudian hari.

Untuk url github bisa dilihat di sini :
SampleDaggerMVP

Saya mengambil beberapa referensi dari sini dan mohon maaf jika mungkin ada yang lupa saya cantumkan.

  • http://www.tinmegali.com/en/model-view-presenter-android-part-1/
  • https://android.jlelse.eu/android-mvp-for-beginners-25889c500443
  • https://code.tutsplus.com/tutorials/how-to-adopt-model-view-presenter-on-android--cms-26206
  • http://hannesdorfmann.com/mosby/mvp/
  • https://upday.github.io/blog/model-view-presenter/
  • https://medium.com/@be.betr.codr/android-mvp-survival-guide-b2094ab79f78
  • https://google.github.io/dagger/users-guide.html
  • https://blog.mindorks.com/introduction-to-dagger-2-using-dependency-injection-in-android-part-1-223289c2a01b
  • https://blog.mindorks.com/introduction-to-dagger-2-using-dependency-injection-in-android-part-2-b55857911bcd
  • https://medium.com/@Miqubel/understanding-dagger-2-367ff1bd184f
  • https://www.thedroidsonroids.com/blog/android/example-realm-mvp-dagger/
  • https://guides.codepath.com/android/Dependency-Injection-with-Dagger-2#dependent-components-vs-subcomponents
  • http://mobologicplus.com/dagger2-dependency-injection-mvp-android/
  • https://www.techyourchance.com/dagger-2-scopes-demystified/