顯示具有 library 標籤的文章。 顯示所有文章
顯示具有 library 標籤的文章。 顯示所有文章

2015年8月1日 星期六

TabLayout will get empty Tab after upgrade design library to 22.2.1

  Google introduces the design library for making material design easier. so we reimplement the tab component by TabLayout. it's work perfectly in 22.2.0. but we get problem after upgrade the version to 22.2.1. the tab doesn't show up anymore(issue track).

  it's work on some place, but some one isn't. we couldn't figure out what is the right way to handle this. so we decide to rollback the version to 22.2.0.








2015年4月25日 星期六

Fresco : an image management library





    臉書在F8發表了自己的Image Loader Library(Android)叫做Fresco,因為他們在市面上找不到完全符合需求的Library,所以自己就寫了一個(這邏輯很Facebook),它主要強調功能有五:1)有更佳的記憶體管理、2)支援Progressive JPEG、3)Animation Format(GIF和WebP)、4)Drawing(更整合customize layer:例如想要塞浮水印之類的)以及 5)更加的Loading體驗。

針對第五點想要特別強調:1) 它可以同時設定多種resolution的圖片,讓較低解析度的圖片先秀出、2) 支援EXIF Thumbnail、3) Auto-resize rotation(base on EXIF)、 4) 讓Android 2.3的裝置也支援WebP。

翻了翻它的source code發現,所以decoder都適用NDK寫的,包含jpeg、png、gif跟WebP真的是佛心來著。看來該把原本在用的Ion拔掉了。


2014年7月7日 星期一

Retrofit : A type-safe REST client for Android and Java



    Square 雖然是做支付的公司,但也open了許多好用的library,像是OkHttp、Picasso跟Otto等等;目前公司產品內有使用的是Otto,它解決了Activity跟Fragment,或者Fragment跟Fragment之間的雙向溝通(關於Otto改天再寫別篇文章來描述使用情境),而今天要介紹的Retrofit能簡化Client跟Server間的Code。

    舉例說明,如果你要對Restful Server拿資料,首先你要開HttpClient,然後把Api的參數(POST/GET/PUT/DELETE以及Parameters)塞進去;因為Android不允許Http Connection跑在UI Thread,所以你必須在包一個AsyncTask;接著要Parsing Response Body,如果是JSON可以用內建的JOSN Library去一層一層get出來,聰明一點就會用Gson Library。對了你別忘記了Http還有很多複雜的情境,像是Response Code : 301/302的Redirect、Cache的功能、Retry的機制等等等等。

完整的程式片段可能會像這樣(別忘了,它還沒辦法handle 301/302、Cache跟Retry的機制):


    Retrofit能讓這一切簡單一些,讓您不再畏懼/厭煩對接所有Restful API,關於使用細節就直接參考官方文件。把同樣的程式用Retrofit再寫一次的結果如下:


如果有任何問題,歡迎各位一起討論。




2014年3月4日 星期二

Bolts it!


    根據前一篇Deferred&Promise的討論後,我們最後選擇了Parse發佈的Bolts。這篇大概介紹一下Bolts的實際應用方式,某些部分比較像是再把官方文件在述說一次,最後再做個總結。

Q. 什麼情況下要用Bolts?
A. 所有會卡UI Thread的事情都要,包含網路存取,檔案讀寫,複雜的運算等等

Sample Code:

Task.callInBackground(new Callable<Result>() {
     @Override
     public Result call() {
         // DO SOMETHING
         return result;
     }
});


Q. 那跟AsyncTask沒什麼差別呀?
A. 沒錯,但是Bolts可以應付更複雜的情境
情境:從網路抓一份list(約一百筆資料),並將list中的個人照片抓取下來,最後放到local資料夾。

難題:當然可以把所有事情放到一個AsyncTask裡面做完,所以整個Task時間拉很長,比較好的做法是不同的工作需求可以用不同的Executor來執行,而不同的Executor可以用不同的Policy來調整(包括ThreadPool的Size,Timeout的時間等等);而且每個Sub-Task也要擁有不同的fallback或Error Handling。

Sample Code:

Task.callInBackground(new Callable<List<User>>() {
     @Override public List<User> call() {
         return queryListFromNetwork();
     }
}, NETWORK_EXECUTOR)
.onSuccess(Continuation<List<User>, List<Image>>() {
    @Override public List<List<Image>> then(Task<List<User>> task) {
        List<Image> list = new ArrayList<Image>();
        for (User user : task.getResult()) {
             list.add(loadImage(user));
        }
        return list;
    }
}, NETWORK_EXECUTOR)
.onSuccess(Continuation<List<Image>, Integer>() {
    @Override public Integer then(Task<List< Image >> task) {
        int count = 0;
        for (Image image : task.getResult()) {
             saveToStorage(image);
             count ++;
        }
        return count;
    }
}, STORAGE_EXECUTOR)
.continueWith(Continuation<Integer, Void>() {
    @Override public void then(Task<Integer> task) {
        if (task.isFault()) {
            task.getError();
        }
        if (task.isComplete()) {
            // show success message
        }
    }
}, UI_EXECUTOR);


Q. 那是否支援等待多個Task?
A. 當然,可以使用Task.whenAll()

Sample Code

List<Task> tasks = new ArrayList<Task>();
for (int i = 0 ; i< 100 ; i ++) {
    tasks.add(Task.callInBackground(new Callable<Void>() {
      @Override public void call() {
         downloadFile();
         return null;
      }
    }));
}
Task.whenAll(tasks).continueWith(Continuation<Void, Void>() {
    @Override public void then(Task<Void> task) {
        if (task.isFault()) {
            task.getError();
        }
        if (task.isComplete()) {
            // show success message
        }
    }
}, UI_EXECUTOR);


Q 看起來那麼完美,那目前是否有些缺點?
A 當然,畢竟是v1.0.0,目前看到比較缺乏的功能:1. 無法cancel Task。2. 當使用whenAll的時候無法取得所有Sub-Task的Result。



如果還有什麼使用上或者解說上不是那麼清楚的地方請與我聯繫討論。



2013年5月10日 星期五

Pure Java java.util.zip Implementation

"Zipped"!!:)

   在J2ME的世界裡,沒有java.util.zip的lib可以用(弔詭的是明明porting也需要jar decoder,還是要包一個zip lib),對於J2ME的開發環境,Jar size動不動就限制2M或4M(此時覺得nokia的偉大,隨便都16M),遊戲圖片想要多一點、華麗一點就可以宣告死刑,當然有很多種方式可以達成目的,例如:降低圖片解析度、減少code size(這有點...)、全部resource用OTA下載、有些programmer就會利用zip的方式減少Jar Size,就最後一個方案是最不傷遊戲畫面及遊戲邏輯的解決方案,該死的是J2ME沒有這個玩意!

   不過日本的J2ME(DoJa)有com.nttdocomo.util.JarInflater取代之,所以才發想此專案 - Jazzlib2me

https://github.com/bearprada/jazzlib2me

   主要還是改自jazzlib這個J2SE的solution,歡迎大家享用(不過話說寫J2ME App的Programmer應該不多了:( )