Series Filebase: cơ bản với Realtime Database

Hôm nay có vấn đề cần giải quyết với realtime database. Thế nên là mình bắt đầu động tới thằng Filebase. Cơ bản về giá thì Firebase có 3 mức. Và tất nhiên có một mức free dành cho các dev với nhu cầu cá nhân ko cần nhiều.

firebase_prising

Như vậy chúng ta đã có 1G free realtime database. Nice job GG.

And now.

Hãy bắt đầu với những thứ thật sự đơn giản:

Notes:

Series introduce firebase

Next: Deep dive into firebase realtime database

StateDataLayout

I intended to write a lib, but turn out it can’t be.

It should be called a architecture to solving the problem than a lib, because it require a lot of constraints. What’s problem ? I’m not in the mood to talk. (If I like it, I’ll do it – as Tùng Mountain said)

Demo Github link: https://github.com/allenatwork/StateDataLayout

A Layout that change state base on response from server.

Layout State:

  • loading
  • error
  • no data
  • have data

Usage

  • Initialize Data layout

In your onCreateView in your fragment, put the following code to intilize StateDataLayout:

stateDataLayout= new StateDataLayout<>(this, inflater);

stateDataLayout .setLayoutRes(getLayoutRes(), R.layout.nodata_layout, R.layout.loading_layout, R.layout.error_layout);
When you start call API, you’ll want to show loading:
     stateDataLayout.bindLoading();
When API response, if success and data return, pass the data into layout:
     stateDataLayout.bindData(data);
And if it error, pass the error message string into layout:
     stateDataLayout.bindError(mes);
  • Define Response Object.

Your response object must implement interface
 
public interface GetInfoData {

    boolean hasData();

}
and sure you have to implemnt hasData() method. Which define the returned data is valid or not (Valid mean has data ?)
  • In your controller class, here is Fragment 

You must implement controller interface:
 
public interface ControllerTask<K> {

    void reload();

     void displayData(K data);

}
K is the class type of response data we said above.
sure you will have to implement two method:
– reload: reload data
– displayData (K data): with the data type K, you (actually) bind it in your view.
That’s it. So simple ,right ?

 

So I started to write a lib (Turned out it can’t be)

Allen tập đọc code

Để trở thành một lập trình viên giỏi thì việc đọc code của người khác là một điều rất quan trọng. Đọc code của cả người giỏi lẫn ko giỏi đều cho chúng ta nhiều kinh nghiệm.

Và còn gì tuyệt vời hơn nếu được đọc code của những chuyên gia tạo nên những app xịn trên playstore. Đặc biệt lại của Google, bố đẻ ra Android. Ngoài ra còn nhiều app khác trên store với hàng trăm triệu người dùng.

Thanh niên này đã dày công sưu tầm một list các opensource app và share trên Medium.

Link tại đây. 

Many thank bro.

Lưu lại đây để đọc dần. ❤

Abtract Vs Interface

Một bài so sánh khá hay về Abtract và interface từ trang gockinhnghiem

Theo quan điểm cá nhân Abtract là để dùng khi thiết kế Object (Status, Behaviour)

Còn Interface là để dùng khi khai báo hành vi (Behaviour).

Một Object thì có những hành vi. Có thể nói, Interface là chia nhỏ hơn của Object. Nó có mặt cũng để phục vụ cho Object.

Về mặt tư tưởng là như vậy, còn về mặt cú pháp thì trích một câu trả lời ở SOF.

The key technical differences between an abstract class and an interface are:

* Abstract classes can have constants, members, method stubs (methods without a body) and defined methods, whereas interfaces can only have constants and methods stubs.

* Methods and members of an abstract class can be defined with any visibility, whereas all methods of an interface must be defined as public (they are defined public by default).

* When inheriting an abstract class, a concrete child class must define the abstract methods, whereas an an abstract class can extend another abstract class and abstract methods from the parent class don't have to be defined.

* Similarly, an interface extending another interface is not responsible for implementing methodsfrom the parent interface. This is because interfaces cannot define any implementation.

* A child class can only extend a single class (abstract or concrete), whereas an interface can extend or a class can implement multiple other interfaces.

*
A child class can define abstract methods with the same or less restrictive visibility, whereas a class implementing an interface must define the methods with the exact same visibility (public).

All about the “Glide”

dependencies {
    compile 'com.github.bumptech.glide:glide:3.7.0'
}

And …

Glide
.with(context)
.load( url)
.placeholder(R.mipmap.ic_launcher) &nbsp;// Default image load to ImageView
.error(R.mipmap.future_studio_launcher) &nbsp;// If error, ImageView will show this
.fallback( R.drawable.floorplan ) &nbsp;/* If url == null, ImageView will show this (To distinguish with case error by server or internet) &nbsp;*/
.crossFade() &nbsp;// Fade Animation
.into(imageView);
  • crossFace() >< dontAnimate()

Còn nữa … (Glide có nhiều cái rất thú vị)