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ị)

Tìm hiểu về thư viện network Retrofit (Phần 1)

Retrofit là một network library mới nổi của Square ( khoảng vài năm…) và thường được so sánh với thư viện Volley của Google.
Retrofit là gì ?
A type-safe REST client for Android and Java.
Ko biết diễn giải ra tiếng việt như thế nào, nhưng cứ hiểu nó tương đương với Volley là được rồi. (Mặc dù đi sâu vào so sánh thì hai thư viện này có những mục đích và chức năng khác nhau. Tuy nhiên chưa cần quan tâm đến bây giờ)
Retrofit đã ra đến phiên bản > 2. và khá ổn định. Trước đó có một phiên bản ổn định và được biết tới nhiều là 1.9. Chúng ta sẽ nghiên cứu >2.0 thôi vì còn học cái cũ làm gì.
Để sử dụng Retrofit, ta khai báo trong gradle.

Ở các phiên bản trước, khi khai báo thì retrofit & OkHttp được khai báo như hai module riêng rẽ, tuy nhiên đến 2.0 trở đi thì mặc định retrofit dùng OkHttp làm tầng network (Network Layer) và xây dựng trên nó rồi.
Vì vậy khai báo chung là như một.
(Retrofit chỉ dùng OkHttp để làm tầng network, còn Volley thì linh động hơn, có thể dùng được OkHttp, Appache, v.vv.)
Ngoài ra đi kèm retrofit cung cấp cả gson converter như là một Convert Factory của nỏ.
(Gson là định dạng phổ biến hiện nay nên khai báo thế. Nếu muốn dùng XML thì cũng có thể khai báo XML converter)
Phần khai báo thư viện đã xong. Tiếp theo dùng Retrofit như thế nào.
Ta sẽ tìm hiểu một khái niệm cơ bản & cốt lõi đó là Service Generator. Mục đích của thằng này là để tạo ra một Adapter REST cơ bản cho class/interface của chúng ta.
Code như sau:
Phân tích đoạn code: chúng ta sẽ khai báo base Url của api.
Sau đó tạo ra một OkHttp client.
Sau đó tạo ra một Builder của retrofit sử dụng base url và network layer là Okhttp vừa khởi tạo.
Sau đó sử dụng builder để tạo ra service cho lớp/interface cần tạo.
“Lớp/interface cần tạo” được nhắc đến ở đây là gì ?
Các interface này là những khai báo về method call api. Trong file này chúng ta sẽ khai báo các api với thông tin như: phương thức call api (GET, POST), tham số truyền vào, kiểu truyền vào, giá trị trả về.
(Contributor là một class dữ liệu )
Khi sử dụng, chúng ta sẽ dùng như sau:
Trong đoạn code trên có thể thấy được vai trò của Service Generator. Interface GitHubClient lúc đầu chỉ là một class khai báo các phương thức. Nhờ có Service Generato mà nó mới trở thành một Http client.
Tạm thời tìm hiểu qua về cách sử dụng Retrofit là như vậy. Ở những bài tiếp theo của serrie retrofit sẽ trình bày các vấn đề sau:
– Cách  truyền tham số vào một API Retrofit.
– Call api Retrofit đồng bộ & bắt đồng bộ.
– So sánh Volley & Retrofit.

Nguyên tắc lập trình SOLID

solid-object-oriented-design

  • Single Responsibility principle: một class chỉ giữ một trách nhiệm duy nhất. Chỉ có thể thay đổi class vì một lí do duy nhất. Nếu bạn ko thể diễn đạt trong một câu, trách nhiệm của class là gì ? 95% là bạn thiết kế tồi.
  • Open/Close principle: có thể thoải mái mở rộng một module, nhưng hạn chế sửa đổi trong module đó.
  • Liskov Substitution principle: trong một CT, các object của class con có thể thay thế class cha mà không làm thay đổi tính đúng đắn của chương trình. Điều này có nghĩa là gì: là class con phải bao hàm đầy đủ tất cả các tính chất của class cha. Lấy ví dụ như một thiết kế: Class VitBau, Vitxiem extend từ class Vit, class VitChayPin cũng có các tính chất như bơi, kêu quác quác, tuy nhiên nó có một tính chất mà ko đáp ứng được với class cha: đó là phải ăn mới sống được. Nghĩa là khi thiết kế object ta cần quan tâm đến tính chất cần sử dụng của class.
  • Interface Segregation Principle: Thay vì dùng một interface lớn thì tách thành nhiều interface nhỏ, với mục đích cụ thể. (Nếu nguyên tắc đầu tiên được áp dụng tốt, nguyên tắc này cũng sẽ tốt theo)
  • Dependency inversion principle: các module cấp cao ko nên phụ thuộc vào module cấp thấp, cả hai nên phụ thuộc vào abtraction / interface. Interface ko nên phụ thuộc vào chi tiết, mà ngược lại chi tiết nên phụ thuộc vào interface.

SOLID please !

Giảm kích thước của apk file

Áp dụng những cách sau, bạn có thể giảm kích thước file apk một cách đáng kể.

  1. Config Gradle
1
2
3
4
5
6
7
8
9
10
buildTypes {
        release {
            shrinkResources true  // get rid of unused resource
            minifyEnabled true  // enlable Proguard, remove unused code
            proguardFiles getDefaultProguardFile(‘proguard-android-optimize.txt’),’proguard-project.txt’
            signingConfig signingConfigs.config
        }
    }
– Sử dụng các định dạng ảnh khác thay vì PNG. Ví dụ JPEG hoặc Vector Drawable khi có thể. (source)
– Xem xét việc sử dụng các thư viện. Không nên dùng một thư viện quá lớn chỉ để đáp ứng một nhu cầu nhỏ
– Chia nhỏ APK (source)