Trong những năm vừa qua, các ứng dụng Android ra đời ngày càng nhiều, kéo theo đó là các thư viện hỗ trợ cho việc phát triển android ngày càng mạnh mẽ, và đầy đủ cho lập trình viên.

Việc nắm bắt và sử dụng các thư viện giúp cho việc phát triển ứng dụng android trở nên nhanh chóng hơn, an toàn hơn và tiết kiệm chi phí cũng như công sức của lập trình viên. Dưới đây là một trong những nguồn công cụ và thư viện giúp bạn phát triển android một cách tốt hơn

I. Công cụ

1. IDE và Emulator

Những IDE cần sử dụng : Android Studio 1.0 và 2.0, đối với bản Android Studio 2.0 vấn đề emulator đã được cải thiện khá nhiều, tốc độ đã tăng lên so với bản 1.0. Tuy nhiên, nếu bạn vẫn gặp vấn đề emulator quá chậm thì nên chú ý tới 1 số emulator tốc độ cao có Intel HAXM, hoặc Genymotion – công cụ cho phép bạn tạo máy ảo nhanh nhất và tiện lợi nhất.

Nếu bạn muốn sử dụng thêm Play Store để có thể tải và test ứng dụng thì emulator cũng hỗ trợ cho bạn, nói chung Genymotion là một emulator rất mạnh mẽ và đang được ưa chuộng hiện nay.

Genymotion :  http://www.genymotion.com

2. Build tool

Build quá chậm, không thể chịu đựng nổi?

Nếu bạn sử dụng gradle thì ngoài cách thêm thư viện hỗ trợ vào, bạn có thể vào Preference của Gradle và check vào mục Offline work.

3. Quản lý UI

Công cụ quản lý thư viện UI và các hoạt động trên android :

DevAppsDirect: thư viện này giúp bạn kiểm tra được app chạy như thế nào trong thực tế.

4. Phân phối bản test

II. Thư viện và các tính năng cần làm

1. Làm chức năng hiển thị danh sách

  • ListView :
    http://developer.android.com/reference/android/widget/ListView.html
    Gần đây có một thư viện mới được thêm vào là RecyclerView, bạn dùng cái này cũng OK.
  • RecyclerView :
    https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html
    Nếu so sánh với TableView trên iOS thì có thể hiểu là class Adapter sẽ có vai trò Delegate – phần xử lí hiển thị của TableView. TrongListView thì đó sẽ là class ListAdapter.
  • ListAdapter :
    http://developer.android.com/reference/android/widget/ListAdapter.html
    Chúng ta sẽ viết xử lí của từng cell vào đó.
    Ngoài ra, chúng ta sẽ cache từng dòng xử lí View để tối ưu performance. Cũng như trong iOS bạn cũng dùng lại Cell đúng không?
  • StickyListHeaders : Giống Instagram, cung cấp header bám theo scroll của ListView.
  • StickyGridHeaders : Phiên bản GridView của library phía trên.
  • Android StaggeredGrid : Có thể đối phó grid có độ cao khác nhau.
  • AdapterView Animator : Helper Library thực hiện animation khi thêm hàng vào AdapterView.
  • cwac-touchlist : Library thực hiện drag-and-drop cho List.

2. UI Component

  • Pull to refresh :
    • ActionBar PullToRefresh: UI Component xuất ra hiển thị có update tại ActionBar khi người dùng pull.
    • Android PullToRefresh: UI Component update khi pull theo phong cách Twitter. Hiện nay đã không maintain nữa nên khuyến khích sử dụng ActionBar PullToRefresh sẽ tốt hơn.
  • ActionBar:
    • FadingActionBar: Library áp dụng effect fade-out tại ActionBar.
    • GlassActionBar: Library áp dụng effect như cửa sổ trong suốt tại ActionBar.
  • WebView:
    • Chromium WebView: Backport Library Webview của Chromium engine được đưa vào từ version KitKat. Sử dụng library này có thể giúp giải quyết được vấn đề tương thích OS version hay device khi implement Webkit.
  • Text・Font:
    • emojicon: Library giúp sử dụng emoji trên TextView.
    • IonIconView: Library giúp hiển thị icon được cung cấp bởi ionicons.com được trên View.
    • Android Iconify: Library giúp sử dụng được các loại font của FontAwesome trong app.
    • Calligraphy: Library giúp làm dễ dàng custom font.
  • Calendar:
    • ExtendedCalendarView: Library cung cấp calendar view có thể hiển thị event, tạo thành set với DB lưu trữ content của calendar.
    • GoogleCalendarView: Backport từ calendar app của Google.
  • ImageView:
    • CustomShape ImageView: ImageView có thể cắt chỉnh ảnh rồi tạo nhiều hình đa dạng.
    • Rounded ImageView: Library tạo ImageView có góc tròn.
    • PhotoView ImageView có chức năng phóng to thu nhỏ ảnh.
    • ImageViewZoom: ImageView có chức năng phóng to thu nhỏ ảnh.

3. Tối ưu hóa code: DI container

  • Dagger: DI container dùng cho Java hay Android của công ty square. Sử dụng annotation javax.inject.Inject. Tạo code khi compile.
  • Proton: DI container dùng cho Android. Sử dụng annotation javax.inject.Inject. Đưa instance vào tại thời điểm execute.
  • ButterKnife: Chuyên hóa cho injection của View.
  • RoboGuice: Wrapper dùng cho Android được Google cung cấp. Bên cạnh sử dụng annotation javax.inject.Inject, cung cấp độc lập annotation dành cho injection.

4. Database

  • GreenDAO: Sử dụng class định nghĩa riêng biệt schema, entity rồi mapping.
  • Active Android: Tại khai báo entity class, thêm annotation rồi mapping. ActiveAndroid  là một ORM dành cho Android. Nó là một trừu tượng của SQLite cho phép bạn giao tiếp với database trong một device khi không phải viết câu lệnh SQL. Một đối tượng kế thừa ActiveAndroid Model có thể lưu database như sau:
user.save();
user.save();
Thay thế cho câu lệnh phức tạp SQLite như sau

INSERT INTO Users (Nickname, Name, Address, City, PostalCode, Country) VALUES ('Batman','Bruce W','Palisades 21','Gotham','40000','USA');
INSERT INTO Users (Nickname, Name, Address, City, PostalCode, Country) VALUES ('Batman','Bruce W','Palisades 21','Gotham','40000','USA');
Ví dụ để lấy tất cả users

List<User> users = new Select().from(User.class).execute();
List<User> users = new Select().from(User.class).execute();
Thay thế cho câu lện SQlite

SELECT Nickname, Name, Address, City, PostalCode, Country FROM Users;
SELECT Nickname, Name, Address, City, PostalCode, Country FROM Users;

ActiveAndroid là một cách hay để xoá đi nhiều đoạn code khi làm việc với databases. Một số thư viện tương tự như GreenDAO và ORMLite.
  • otto: Eventbus nhẹ cho Android dựa trên Guava.
  • EventBus: Có extension về chức năng hơn otto.Eventbus.

5. Thư viện làm việc với internet, mạng (networking)

Có thể nói, trong lập trình Android nói chung và lập trình nói riêng, việc xử lý các vấn đề với networking là một trong các công việc quan trọng nhất. Công việc này luôn đòi hỏi thời gian, độ khó cao nhất trong dự án.

Vì vậy, mình sẽ tổng hợp và giới thiệu một vài thư viện hữu dụng, tốt nhất để xử lý networking trong lập trình Android.

**Retrofit: trên trang chủ của Retrofit có câu: “Retrofit turns your REST API into a Java interface” nói lên đầy đủ chức năng của nó.Đây là một giải pháp tuyệt vời để tổ chức các lời gọi API trong một dự án.

Các lời gọi request được thêm đơn giản và tiện dụng. Ta sử dụng Callback để lấy kết quả các request gửi lên.

public interface RetrofitInterface {
    // asynchronously with a callback
    @GET("/api/user")
    User getUser(@Query("user_id") int userId, Callback<User> callback);
    // synchronously
    @POST("/api/user/register")
    User registerUser(@Body User user);
}
// example
RetrofitInterface retrofitInterface = new RestAdapter.Builder()
            .setEndpoint(API.API_URL).build().create(RetrofitInterface.class);
 
// fetch user with id 2048
retrofitInterface.getUser(2048, new Callback<User>() {
    @Override
    public void success(User user, Response response) {
 
    }
    @Override
    public void failure(RetrofitError retrofitError) {
 
    }
});

Retrofit là một REST Client(1) cho Android và JAVA. Nó được phát triển giúp cho quá trình kết nối client – server trở nên dễ dàng, nhanh chóng.Với Retrofit bạn có thể GET, POST, PUT, DELETE...

Dưới đây là kết quả so sánh thời gian thực thi giữa Async Task thuần của Android, Volley Library của Google và Retrofit :

Retrofit

Bạn có thể thấy Retrofit đạt tốc độ vượt trội hơn hẳn.

Volley

Volley là một Networking Library được Google phát triển và công bố tại Google I/O 2013 để quản lý các request network và lưu trữ các kết quả trả về – response, nó giúp các nhà phát triển – developers không phải viết nhiều code như trước nữa.

Các tính năng – features trong Volley cho phép cùng một lúc thực hiện nhiều request trên các tiến trình – threads khác nhau với các mức độ ưu tiên – priority. Tất cả các request được thực hiện và lưu trữ trong bộ nhớ cache – cache memories giúp cho việc reload lại dữ liệu nhanh hơn.

Toàn bộ response được lưu trong memories vậy nên nó không tốt khi dùng để load các dữ liệu lớn như âm nhạc – music hoặc phim – movies. Nhưng nó thực sự tuyệt vời để load các dữ liệu dạng JSON, Image hay String.

GSON: là một java library hỗ trợ việc convert Java Objects sang định dạng JSON tương ứng, và ngược lại, nó cũng có thể sử dụng để convert từ JSON sang Java Objects.

Có một vài thư viện Java cũng có khả năng làm việc này, những Google Gson hỗ trợ tối ưu hơn cả và đặc biệt nó được update liên tục. Nó có thể làm việc với các Java Object tùy ý ngay cả với việc các object trong hệ thống cũ không có source code.

Mục đích của Google Gson

  • Cung cấp kỹ thuật xử lý đơn giản để convert từ Java Object sang JSON và ngược lại.
  • Cho phép các unmodifiable objects converted từ Java sang JSON và ngược lại.
  • Hỗ trợ mở rộng Java Generics.
  • Cho phép custom format của object.
  • Hỗ trợ custom các objects phức tạp.
  • Và rất nhiều nữa...

Ngoài ra, GSON cũng là nhân của Retrofit đã nói ở trên.

Android Asynchronous Http Client

Là một thư viện Http Client xây dựng trên cơ chế callback bất đồng bộ dựa vào Apache’s Http Libraries.Mọi request được thực hiện bên ngoài thread UI chính trong ứng dụng của bạn, nhưng bất kì một callback logic nào sẽ được lại trên cùng một thread như callback sử dụng Handler của Android.

Các tính năng chính:

  • Tạo các request Http bất đồng bộ, xử lý các kết quả trả về trong các callback ẩn danh.
  • Thực hiện HTTP requests bên ngoài UI thread...