Universal-Image-loader 部分源碼講解 及 如何 配合阿里雲 實現圖片緩存
- ImagerLoader 相關使用及使用 我就不再囉嗦了 ,有需求的同學請直接飛過去http://blog.csdn.net/xiaanming/article/details/26810303
- 開始講下阿里雲圖片 服務器使用及其 android 端的 oss-android-sdk-1.0.0.jar 以下貼出android 端管理類。
public class OSSManager {
private static OSSManager instance;
private static OSSService ossService;
public static OSSManager getInstance() {
if (instance == null) {
instance = new OSSManager();
}
return instance;
}
public static OSSService getOssService() {
return ossService;
}
private static String TAG = OSSManager.class.getSimpleName();
public void Init(final Context context) {
if (ossService == null) {
ossService = OSSServiceProvider.getService();
}
ossService.setGlobalDefaultTokenGenerator(new TokenGenerator() {
@Override
public String generateToken(String httpMethod, String md5,
String type, String date, String ossHeaders, String resource) {
//demo的順序 不要動它
String content = httpMethod + "\n" + md5 + "\n" + type + "\n"
+ date + "\n" + ossHeaders + resource;
//以下代碼是請求 密鑰的 方法 必須實現(你換成你自己的http 請求 就好了),其他代碼 直接照搬 demo就好了
// ClientServer server = new ClientServer(InterfaceMethod.get36(content));
// ResultBean resultBean = server.execute(context);
// if (resultBean != null&&resultBean.getErr()==0) {
// @SuppressWarnings("unchecked")
// Map<String,String> map = (Map<String, String>) resultBean.getResultParam(Map.class)
// .get(0);
// //map.get("data") 爲服務器加密後的key 直接返回就好了
// return map.get("data");
// } else {
return "";
// }
}
});
ossService.setGlobalDefaultHostId("oss-cn-hangzhou.aliyuncs.com");
ossService.setCustomStandardTimeWithEpochSec(System.currentTimeMillis() / 1000);
ossService.setGlobalDefaultACL(AccessControlList.PRIVATE);
// 默認爲private
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectTimeout(15 * 1000); // 設置全局網絡連接超時時間,默認30s
conf.setSocketTimeout(15 * 1000); // 設置全局socket超時時間,默認30s
conf.setMaxConnections(50); // 設置全局最大併發網絡鏈接數, 默認50
ossService.setClientConfiguration(conf);
}
}
3.文件 上傳
public static OSSData postImageOSSdata(byte[] dataToUpload, String path) {
LogUtil.i("服務器地址", path);
OSSData data = getOssService().getOssData(getUploadBucket(), path);
data.setData(dataToUpload, "image/jpeg");
//上傳監聽
data.uploadInBackground(new SaveCallback() {
@Override
public void onSuccess(String objectKey) {
Log.d(TAG, "[onSuccess] - " + objectKey
+ " upload success!");
}
@Override
public void onProgress(String objectKey, int byteCount,
int totalSize) {
Log.d(TAG, "[onProgress] - current upload " + objectKey
+ " bytes: " + byteCount + " in total: "
+ totalSize);
}
@Override
public void onFailure(String objectKey,
OSSException ossException) {
}
});
return data;
}
//文件儲存服務器
private static OSSBucket getUploadBucket() {
OSSBucket bucket = getOssService().getOssBucket("你們租用服務器的名字");
return bucket;
}
4.獲取圖片
public static byte[] getImage(String path) {
byte[] bData = null;
OSSData data = getOssService().getOssData(getBucket(), path);
try {
bData = data.get();
Log.d(TAG, "finish getting data! length: " + bData.length);
} catch (OSSException e) {
HandleException.handleException(e);
}
return bData;
//圖片處理 服務器 OSSBucket
private static OSSBucket getBucket() {
//這裏 使用已經綁定域名的 圖片服務器 應爲OSS 規定只有綁定圖片服務器域名了纔可以 使用圖片服務器功能(比如圖片壓縮)
OSSBucket bucket = getOssService().getOssBucket("你們綁定的 圖片服務器域名");
bucket.setBucketHostId("你們綁定的 圖片服務器域名");
return bucket;
}
- 上面已經把Oss 用到的設置及 主要的2個方法 已經 寫出來了,現在我們來配合一下 Universal-Image-Loader。
File cacheDir = StorageUtils.getCacheDirectory(context);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.diskCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)
.taskExecutor(...)
.taskExecutorForCachedImages(...)
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 1) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiscCache(cacheDir)) // default
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(100)
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
//這句是關鍵點 把這個配置到你的代碼裏。
.imageDownloader(new AliLoader(context))
.imageDecoder(new BaseImageDecoder()) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs()
.build();
6.自定義 AliLoader 類。
public class AliLoader extends BaseImageDownloader {
private static boolean isgetToken = false;
// private String uri;
public AliLoader(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected InputStream getStreamFromOtherSource(String imageUri, Object extra)
throws IOException {
// TODO Auto-generated method stub
byte[] b = OSSManager.getImage(imageUri);
if (b != null) {
return new ByteArrayInputStream(b);
} else {
return super.getStreamFromOtherSource(imageUri, extra);
}
}
7.大家有疑問可以 留言 我每天都會登陸 當天解答問題,謝謝支持。