1. 程式人生 > >Android UI 開源框架ImageLoader的完美例子

Android UI 開源框架ImageLoader的完美例子

               

Android開源框架ImageLoader的完美例子

2013年8月19日開源框架之Universal_Image_Loader學習

很多人都在討論如何讓圖片能在非同步載入更加流暢,可以顯示大量圖片,在拖動ListView的時候不會出現卡的現象。關於ImageLoader這個開源框架的使用有很多網友都介紹過,不過還不夠清楚,這裡有一個關於這個開源專案的完美例子,ListView的圖片載入、GridView的圖片載入、ViewPager的圖片載入、Gallery畫廊的圖片載入、Widget的使用。很完善的一個例子,在這裡我把所有介面效果做出部落格分享出來,需要原始碼的朋友到我的資源頁下載

要使用ImageLoader就要到這裡下載jar包:

然後匯入專案中去就行了

專案文件結構圖:

從介面說起,介面本身是沒什麼好說的,就是如何在xml當中進行定義罷了

有以下這麼多個佈局檔案

一個一個來看唄

首先是這樣的效果

這個在Android4.2.2比較好看,在Android2.3.3就顯得比較挫。

/2013.8.19_Universal_Image_Loader_Demo/res/layout/ac_home.xml

<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width
="fill_parent"    android:layout_height="fill_parent" >
    <LinearLayout        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:orientation="vertical" >        <TextView            android:layout_width="fill_parent"            android:layout_height
="wrap_content"            android:gravity="center"            android:paddingBottom="10dip"            android:paddingTop="20dip"            android:text="@string/label_activity_examples"            android:textSize="24sp" />
        <Button            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_margin="10dip"            android:onClick="onImageListClick"            android:text="@string/button_image_list" />        <Button            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_margin="10dip"            android:onClick="onImageGridClick"            android:text="@string/button_image_grid" />        <Button            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_margin="10dip"            android:onClick="onImagePagerClick"            android:text="@string/button_image_pager" />        <Button            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_margin="10dip"            android:onClick="onImageGalleryClick"            android:text="@string/button_image_gallery" />    </LinearLayout></ScrollView>
列表非同步載入圖片效果

/2013.8.19_Universal_Image_Loader_Demo/res/layout/ac_image_list.xml

<?xml version="1.0" encoding="utf-8"?><ListView xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@android:id/list"    android:layout_width="fill_parent"    android:layout_height="fill_parent" />
/2013.8.19_Universal_Image_Loader_Demo/res/layout/item_list_image.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content" >    <ImageView        android:id="@+id/image"        android:layout_width="72dip"        android:layout_height="72dip"        android:layout_margin="3dip"        android:adjustViewBounds="true"        android:contentDescription="@string/descr_image"        android:scaleType="centerCrop" />    <TextView        android:id="@+id/text"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_gravity="left|center_vertical"        android:layout_marginLeft="20dip"        android:textSize="22sp" /></LinearLayout>
GridView非同步載入圖片顯示

/2013.8.19_Universal_Image_Loader_Demo/res/layout/ac_image_grid.xml

<?xml version="1.0" encoding="utf-8"?><GridView xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/gridview"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:gravity="center"    android:horizontalSpacing="4dip"    android:numColumns="3"    android:stretchMode="columnWidth"    android:verticalSpacing="4dip"    android:padding="4dip" />

/2013.8.19_Universal_Image_Loader_Demo/res/layout/item_grid_image.xml

<?xml version="1.0" encoding="utf-8"?><ImageView xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/image"    android:layout_width="fill_parent"    android:layout_height="120dip"    android:adjustViewBounds="true"    android:contentDescription="@string/descr_image"    android:scaleType="centerCrop" />

ViewPager非同步載入圖片顯示

/2013.8.19_Universal_Image_Loader_Demo/res/layout/ac_image_pager.xml

<?xml version="1.0" encoding="utf-8"?><android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/pager"    android:layout_width="fill_parent"    android:layout_height="fill_parent" />
/2013.8.19_Universal_Image_Loader_Demo/res/layout/item_pager_image.xml
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:padding="1dip" >    <ImageView        android:id="@+id/image"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:adjustViewBounds="true"        android:contentDescription="@string/descr_image" />    <ProgressBar        android:id="@+id/loading"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:visibility="gone" /></FrameLayout>

Gallery畫廊非同步載入圖片顯示

/2013.8.19_Universal_Image_Loader_Demo/res/layout/ac_image_gallery.xml

<?xml version="1.0" encoding="utf-8"?><Gallery xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/gallery"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:layout_gravity="center_vertical"    android:spacing="1dip" />

/2013.8.19_Universal_Image_Loader_Demo/res/layout/item_gallery_image.xml

<?xml version="1.0" encoding="utf-8"?><ImageView xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/image"    android:layout_width="120dip"    android:layout_height="120dip"    android:layout_gravity="center"    android:adjustViewBounds="true"    android:contentDescription="@string/descr_image"    android:scaleType="centerCrop" />

還有一個就是桌面小部件

以上只是佈局檔案,沒有什麼可以說,具體Activity程式碼實現如下:

先是這個:

/2013.8.19_Universal_Image_Loader_Demo/src/com/nostra13/example/universalimageloader/HomeActivity.java

主介面Activity程式碼

/******************************************************************************* * Copyright 2011-2013 Sergey Tarasevich * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/package com.nostra13.example.universalimageloader;import static com.nostra13.example.universalimageloader.Constants.IMAGES;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import android.content.Intent;import android.os.Bundle;import android.view.View;import com.nostra13.example.universalimageloader.Constants.Extra;import com.nostra13.universalimageloader.utils.L;/** * @author Sergey Tarasevich (nostra13[at]gmail[dot]com) */public class HomeActivity extends BaseActivity private static final String TEST_FILE_NAME = "Universal Image Loader @#&=+-_.,!()~'%20.png"@Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.ac_home);  // 定義檔案物件,目錄:/mnt/sdcard, 檔名:TEST_FILE_NAME  File testImageOnSdCard = new File("/mnt/sdcard", TEST_FILE_NAME);  if (!testImageOnSdCard.exists()) { // 如果檔案不存在   // 把檔案複製到SD卡   copyTestImageToSdCard(testImageOnSdCard);  } } // 點選進入ListView展示介面 public void onImageListClick(View view) {  Intent intent = new Intent(this, ImageListActivity.class);  intent.putExtra(Extra.IMAGES, IMAGES);  startActivity(intent); } // 點選進入GridView展示介面 public void onImageGridClick(View view) {  Intent intent = new Intent(this, ImageGridActivity.class);  intent.putExtra(Extra.IMAGES, IMAGES);  startActivity(intent); } // 點選進入ViewPager展示介面 public void onImagePagerClick(View view) {  Intent intent = new Intent(this, ImagePagerActivity.class);  intent.putExtra(Extra.IMAGES, IMAGES);  startActivity(intent); } // 點選進入畫廊展示介面 public void onImageGalleryClick(View view) {  Intent intent = new Intent(this, ImageGalleryActivity.class);  intent.putExtra(Extra.IMAGES, IMAGES);  startActivity(intent); } @Override public void onBackPressed() {  imageLoader.stop();  // 停止載入圖片  super.onBackPressed(); } /**  * 開一個執行緒把assert目錄下的圖片複製到SD卡目錄下  * @param testImageOnSdCard  */ private void copyTestImageToSdCard(final File testImageOnSdCard) {  new Thread(new Runnable() {   @Override   public void run() {    try {     InputStream is = getAssets().open(TEST_FILE_NAME);     FileOutputStream fos = new FileOutputStream(testImageOnSdCard);     byte[] buffer = new byte[8192];     int read;     try {      while ((read = is.read(buffer)) != -1) {       fos.write(buffer, 0, read); // 寫入輸出流      }     } finally {      fos.flush();  // 寫入SD卡      fos.close();  // 關閉輸出流      is.close();   // 關閉輸入流     }    } catch (IOException e) {     L.w("Can't copy test image onto SD card");    }   }  }).start();  // 啟動執行緒 }}
/2013.8.19_Universal_Image_Loader_Demo/src/com/nostra13/example/universalimageloader/BaseActivity.java
/******************************************************************************* * Copyright 2011-2013 Sergey Tarasevich * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/package com.nostra13.example.universalimageloader;import android.app.Activity;import android.view.Menu;import android.view.MenuItem;import com.nostra13.universalimageloader.core.ImageLoader;/** * @author Sergey Tarasevich (nostra13[at]gmail[dot]com) */public abstract class BaseActivity extends Activity protected ImageLoader imageLoader = ImageLoader.getInstance(); @Override public boolean onCreateOptionsMenu(Menu menu) {  // 載入選單  getMenuInflater().inflate(R.menu.main_menu, menu);  return true; } @Override public boolean onOptionsItemSelected(MenuItem item) {  switch (item.getItemId()) {   case R.id.item_clear_memory_cache:    imageLoader.clearMemoryCache();  // 清除記憶體快取    return true;   case R.id.item_clear_disc_cache:    imageLoader.clearDiscCache();  // 清除SD卡中的快取    return true;   default:    return false;  } }}

/2013.8.19_Universal_Image_Loader_Demo/src/com/nostra13/example/universalimageloader/AbsListViewBaseActivity.java

/******************************************************************************* * Copyright 2011-2013 Sergey Tarasevich * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/package com.nostra13.example.universalimageloader;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.AbsListView;import com.nostra13.universalimageloader.core.assist.PauseOnScrollListener;/** *  *  * @author Sergey Tarasevich (nostra13[at]gmail[dot]com) */public class AbsListViewBaseActivity extends BaseActivity protected static final String STATE_PAUSE_ON_SCROLL = "STATE_PAUSE_ON_SCROLL"protected static final String STATE_PAUSE_ON_FLING = "STATE_PAUSE_ON_FLING"protected AbsListView listView; protected boolean pauseOnScroll = falseprotected boolean pauseOnFling = true@Override public void onRestoreInstanceState(Bundle savedInstanceState) {  pauseOnScroll = savedInstanceState.getBoolean(STATE_PAUSE_ON_SCROLL, false);  pauseOnFling = savedInstanceState.getBoolean(STATE_PAUSE_ON_FLING, true); } @Override public void onResume() {  super.onResume();  applyScrollListener(); } private void applyScrollListener() {  listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling)); } @Override public void onSaveInstanceState(Bundle outState) {  outState.putBoolean(STATE_PAUSE_ON_SCROLL, pauseOnScroll);  outState.putBoolean(STATE_PAUSE_ON_FLING, pauseOnFling); } @Override public boolean onPrepareOptionsMenu(Menu menu) {  MenuItem pauseOnScrollItem = menu.findItem(R.id.item_pause_on_scroll);  pauseOnScrollItem.setVisible(true);  pauseOnScrollItem.setChecked(pauseOnScroll);  MenuItem pauseOnFlingItem = menu.findItem(R.id.item_pause_on_fling);  pauseOnFlingItem.setVisible(true);  pauseOnFlingItem.setChecked(pauseOnFling);  return true; } @Override public boolean onOptionsItemSelected(MenuItem item) {  switch (item.getItemId()) {   case R.id.item_pause_on_scroll:    pauseOnScroll = !pauseOnScroll;    item.setChecked(pauseOnScroll);    applyScrollListener();    return true;   case R.id.item_pause_on_fling:    pauseOnFling = !pauseOnFling;    item.setChecked(pauseOnFling);    applyScrollListener();    return true;   default:    return super.onOptionsItemSelected(item);  } }}

/2013.8.19_Universal_Image_Loader_Demo/src/com/nostra13/example/universalimageloader/Constants.java

常量類程式碼

/******************************************************************************* * Copyright 2011-2013 Sergey Tarasevich * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/package com.nostra13.example.universalimageloader;/** * @author Sergey Tarasevich (nostra13[at]gmail[dot]com) * 常量類 */public final class Constants // 一堆圖片連結 public static final String[] IMAGES = new String[] {   // Heavy images   "https://lh6.googleusercontent.com/-jZgveEqb6pg/T3R4kXScycI/AAAAAAAAAE0/xQ7CvpfXDzc/s1024/sample_image_01.jpg",   "https://lh4.googleusercontent.com/-K2FMuOozxU0/T3R4lRAiBTI/AAAAAAAAAE8/a3Eh9JvnnzI/s1024/sample_image_02.jpg",   "https://lh5.googleusercontent.com/-SCS5C646rxM/T3R4l7QB6xI/AAAAAAAAAFE/xLcuVv3CUyA/s1024/sample_image_03.jpg",   "https://lh6.googleusercontent.com/-f0NJR6-_Thg/T3R4mNex2wI/AAAAAAAAAFI/45oug4VE8MI/s1024/sample_image_04.jpg",   "https://lh3.googleusercontent.com/-n-xcJmiI0pg/T3R4mkSchHI/AAAAAAAAAFU/EoiNNb7kk3A/s1024/sample_image_05.jpg",   "https://lh3.googleusercontent.com/-X43vAudm7f4/T3R4nGSChJI/AAAAAAAAAFk/3bna6D-2EE8/s1024/sample_image_06.jpg",   "https://lh5.googleusercontent.com/-MpZneqIyjXU/T3R4nuGO1aI/AAAAAAAAAFg/r09OPjLx1ZY/s1024/sample_image_07.jpg",   "https://lh6.googleusercontent.com/-ql3YNfdClJo/T3XvW9apmFI/AAAAAAAAAL4/_6HFDzbahc4/s1024/sample_image_08.jpg",   "https://lh5.googleusercontent.com/-Pxa7eqF4cyc/T3R4oasvPEI/AAAAAAAAAF0/-uYDH92h8LA/s1024/sample_image_09.jpg",   "https://lh4.googleusercontent.com/-Li-rjhFEuaI/T3R4o-VUl4I/AAAAAAAAAF8/5E5XdMnP1oE/s1024/sample_image_10.jpg",   "https://lh5.googleusercontent.com/-_HU4fImgFhA/T3R4pPVIwWI/AAAAAAAAAGA/0RfK_Vkgth4/s1024/sample_image_11.jpg",   "https://lh6.googleusercontent.com/-0gnNrVjwa0Y/T3R4peGYJwI/AAAAAAAAAGU/uX_9wvRPM9I/s1024/sample_image_12.jpg",   "https://lh3.googleusercontent.com/-HBxuzALS_Zs/T3R4qERykaI/AAAAAAAAAGQ/_qQ16FaZ1q0/s1024/sample_image_13.jpg",   "https://lh4.googleusercontent.com/-cKojDrARNjQ/T3R4qfWSGPI/AAAAAAAAAGY/MR5dnbNaPyY/s1024/sample_image_14.jpg",   "https://lh3.googleusercontent.com/-WujkdYfcyZ8/T3R4qrIMGUI/AAAAAAAAAGk/277LIdgvnjg/s1024/sample_image_15.jpg",   "https://lh6.googleusercontent.com/-FMHR7Vy3PgI/T3R4rOXlEKI/AAAAAAAAAGs/VeXrDNDBkaw/s1024/sample_image_16.jpg",   "https://lh4.googleusercontent.com/-mrR0AJyNTH0/T3R4rZs6CuI/AAAAAAAAAG0/UE1wQqCOqLA/s1024/sample_image_17.jpg",   "https://lh6.googleusercontent.com/-z77w0eh3cow/T3R4rnLn05I/AAAAAAAAAG4/BaerfWoNucU/s1024/sample_image_18.jpg",   "https://lh5.googleusercontent.com/-aWVwh1OU5Bk/T3R4sAWw0yI/AAAAAAAAAHE/4_KAvJttFwA/s1024/sample_image_19.jpg",   "https://lh6.googleusercontent.com/-q-js52DMnWQ/T3R4tZhY2sI/AAAAAAAAAHM/A8kjp2Ivdqg/s1024/sample_image_20.jpg",   "https://lh5.googleusercontent.com/-_jIzvvzXKn4/T3R4t7xpdVI/AAAAAAAAAHU/7QC6eZ10jgs/s1024/sample_image_21.jpg",   "https://lh3.googleusercontent.com/-lnGi4IMLpwU/T3R4uCMa7vI/AAAAAAAAAHc/1zgzzz6qTpk/s1024/sample_image_22.jpg",   "https://lh5.googleusercontent.com/-fFCzKjFPsPc/T3R4u0SZPFI/AAAAAAAAAHk/sbgjzrktOK0/s1024/sample_image_23.jpg",   "https://lh4.googleusercontent.com/-8TqoW5gBE_Y/T3R4vBS3NPI/AAAAAAAAAHs/EZYvpNsaNXk/s1024/sample_image_24.jpg",   "https://lh6.googleusercontent.com/-gc4eQ3ySdzs/T3R4vafoA7I/AAAAAAAAAH4/yKii5P6tqDE/s1024/sample_image_25.jpg",   "https://lh5.googleusercontent.com/--NYOPCylU7Q/T3R4vjAiWkI/AAAAAAAAAH8/IPNx5q3ptRA/s1024/sample_image_26.jpg",   "https://lh6.googleusercontent.com/-9IJM8so4vCI/T3R4vwJO2yI/AAAAAAAAAIE/ljlr-cwuqZM/s1024/sample_image_27.jpg",   "https://lh4.googleusercontent.com/-KW6QwOHfhBs/T3R4w0RsQiI/AAAAAAAAAIM/uEFLVgHPFCk/s1024/sample_image_28.jpg",   "https://lh4.googleusercontent.com/-z2557Ec1ctY/T3R4x3QA2hI/AAAAAAAAAIk/9-GzPL1lTWE/s1024/sample_image_29.jpg",   "https://lh5.googleusercontent.com/-LaKXAn4Kr1c/T3R4yc5b4lI/AAAAAAAAAIY/fMgcOVQfmD0/s1024/sample_image_30.jpg",   "https://lh4.googleusercontent.com/-F9LRToJoQdo/T3R4yrLtyQI/AAAAAAAAAIg/ri9uUCWuRmo/s1024/sample_image_31.jpg",   "https://lh4.googleusercontent.com/-6X-xBwP-QpI/T3R4zGVboII/AAAAAAAAAIs/zYH4PjjngY0/s1024/sample_image_32.jpg",   "https://lh5.googleusercontent.com/-VdLRjbW4LAs/T3R4zXu3gUI/AAAAAAAAAIw/9aFp9t7mCPg/s1024/sample_image_33.jpg",   "https://lh6.googleusercontent.com/-gL6R17_fDJU/T3R4zpIXGjI/AAAAAAAAAI8/Q2Vjx-L9X20/s1024/sample_image_34.jpg",   "https://lh3.googleusercontent.com/-1fGH4YJXEzo/T3R40Y1B7KI/AAAAAAAAAJE/MnTsa77g-nk/s1024/sample_image_35.jpg",   "https://lh4.googleusercontent.com/-Ql0jHSrea-A/T3R403mUfFI/AAAAAAAAAJM/qzI4SkcH9tY/s1024/sample_image_36.jpg",   "https://lh5.googleusercontent.com/-BL5FIBR_tzI/T3R41DA0AKI/AAAAAAAAAJk/GZfeeb-SLM0/s1024/sample_image_37.jpg",   "https://lh4.googleusercontent.com/-wF2Vc9YDutw/T3R41fR2BCI/AAAAAAAAAJc/JdU1sHdMRAk/s1024/sample_image_38.jpg",   "https://lh6.googleusercontent.com/-ZWHiPehwjTI/T3R41zuaKCI/AAAAAAAAAJg/hR3QJ1v3REg/s1024/sample_image_39.jpg",   // Light images   "http://tabletpcssource.com/wp-content/uploads/2011/05/android-logo.png",   "http://simpozia.com/pages/images/stories/windows-icon.png",   "https://si0.twimg.com/profile_images/1135218951/gmail_profile_icon3_normal.png",   "http://www.krify.net/wp-content/uploads/2011/09/Macromedia_Flash_dock_icon.png",   "http://radiotray.sourceforge.net/radio.png",   "http://www.bandwidthblog.com/wp-content/uploads/2011/11/twitter-logo.png",   "http://weloveicons.s3.amazonaws.com/icons/100907_itunes1.png",   "http://weloveicons.s3.amazonaws.com/icons/100929_applications.png",   "http://www.idyllicmusic.com/index_files/get_apple-iphone.png",   "http://www.frenchrevolutionfood.com/wp-content/uploads/2009/04/Twitter-Bird.png",   "http://3.bp.blogspot.com/-ka5MiRGJ_S4/TdD9OoF6bmI/AAAAAAAAE8k/7ydKtptUtSg/s1600/Google_Sky%2BMaps_Android.png",   "http://www.desiredsoft.com/images/icon_webhosting.png",   "http://goodereader.com/apps/wp-content/uploads/downloads/thumbnails/2012/01/hi-256-0-99dda8c730196ab93c67f0659d5b8489abdeb977.png",   "http://1.bp.blogspot.com/-mlaJ4p_3rBU/TdD9OWxN8II/AAAAAAAAE8U/xyynWwr3_4Q/s1600/antivitus_free.png",   "http://cdn3.iconfinder.com/data/icons/transformers/computer.png",   "http://cdn.geekwire.com/wp-content/uploads/2011/04/firefox.png?7794fe",   "https://ssl.gstatic.com/android/market/com.rovio.angrybirdsseasons/hi-256-9-347dae230614238a639d21508ae492302340b2ba",   "http://androidblaze.com/wp-content/uploads/2011/12/tablet-pc-256x256.jpg",   "http://www.theblaze.com/wp-content/uploads/2011/08/Apple.png",   "http://1.bp.blogspot.com/-y-HQwQ4Kuu0/TdD9_iKIY7I/AAAAAAAAE88/3G4xiclDZD0/s1600/Twitter_Android.png",   "http://3.bp.blogspot.com/-nAf4IMJGpc8/TdD9OGNUHHI/AAAAAAAAE8E/VM9yU_lIgZ4/s1600/Adobe%2BReader_Android.png",   "http://cdn.geekwire.com/wp-content/uploads/2011/05/oovoo-android.png?7794fe",   "http://icons.iconarchive.com/icons/kocco/ndroid/128/android-market-2-icon.png",   "http://thecustomizewindows.com/wp-content/uploads/2011/11/Nicest-Android-Live-Wallpapers.png",   "http://c.wrzuta.pl/wm16596/a32f1a47002ab3a949afeb4f",   "http://macprovid.vo.llnwd.net/o43/hub/media/1090/6882/01_headline_Muse.jpg",   // Special cases   "http://cdn.urbanislandz.com/wp-content/uploads/2011/10/MMSposter-large.jpg", // very large image