Android Query 是個頗酷的 Android library,顧名思義就是給 Android 用但用法很像 jQuery 的東西。

跟 jQuery 一樣,AQuery 的目標是讓 Android developer 可以 write less and do more:

public void renderContent(Content content, View view) {
    AQuery aq = new AQuery(view);
    aq.id(R.id.icon).image(R.drawable.icon).visible().clicked(this, "someMethod");  
    aq.id(R.id.name).text(content.getPname());
    aq.id(R.id.time).text(FormatUtility.relativeTime(System.currentTimeMillis(), content.getCreate())).visible();
    aq.id(R.id.desc).text(content.getDesc()).visible();
}

也可以輕鬆地執行 AJAX:

public void asyncJson(){
    // perform a Google search in just a few lines of code
    String url = "http://www.google.com/uds/GnewsSearch?q=Obama&v=1.0";
    aq.ajax(url, JSONObject.class, this, "jsonCallback");
}

public void jsonCallback(String url, JSONObject json, AjaxStatus status) {
    if (json != null){
        // successful ajax call
    } else {
        // ajax error
    }
}

另外兩個蠻實用的功能是 getCachedImage 及 shouldDelay,直接參考它們的說明吧:

/**
    * Return bitmap cached by image requests. Returns null if url is not cached.
    *
    * @param url
    * @param targetWidth The desired downsampled width.
    *
    * @return Bitmap
    */
public Bitmap getCachedImage(String url, int targetWidth){
        Bitmap result = BitmapAjaxCallback.getMemoryCached(url, targetWidth);
        if(result == null){
                File file = getCachedFile(url);
                if(file != null){
                        result = BitmapAjaxCallback.getResizedImage(file.getAbsolutePath(), null, targetWidth, true, 0);
                }
        }

        return result;
}

/**
    * Determines if a list or gallery view item should delay loading a url resource because the view is scrolling very fast.
    * The primary purpose of this method is to skip loading remote resources (such as images) over the internet
    * until the list stop flinging and the user is focusing on the displaying items.
    *
    * If the scrolling stops and there are delayed items displaying, the getView method will be called again to force
    * the delayed items to be redrawn. During redraw, this method will always return false, thus allowing a particular
    * resource to be loaded.
    *
    * Designed to be used inside getView(int position, View convertView, ViewGroup parent) of an adapter.
    *
    * 
*
* Example usage: *
    *              public View getView(int position, View convertView, ViewGroup parent) {
    *                      ...
    *
    *                      if(aq.shouldDelay(position, convertView, parent, tbUrl)){
    *                              aq.id(R.id.tb).image(placeholder);
    *                      }else{
    *                              aq.id(R.id.tb).image(tbUrl, true, true, 0, 0, placeholder, 0, 0);
    *                      }
    *
    *                      ...
    *              }
    * 
* *
* NOTE: * *
* This method uses the setOnScrollListener() method and will override any previously non-aquery assigned scroll listener. * If a scrolled listener is required, use the aquery method scrolled(OnScrollListener listener) to set the listener * instead of directly calling setOnScrollListener(). * * @param position the position of the item * @param convertView the list item view * @param parent the parent input of getView * @param url the content url to be checked if cached and is available immediately * * @return delay should delay loading a particular resource */ public boolean shouldDelay(int position, View convertView, ViewGroup parent, String url){ if(parent instanceof ExpandableListView){ throw new IllegalArgumentException("Please use the other shouldDelay methods for expandable list."); } return Common.shouldDelay(position, convertView, parent, url); }

這個 library 應該會成為我開發 Android app 的標準配備。