package com.kitty.poclient.util;
import java.io.File;
import java.io.IOException;
import org.fourthline.cling.controlpoint.ActionCallback;
import org.fourthline.cling.model.action.ActionInvocation;
import org.fourthline.cling.model.message.UpnpResponse;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import com.kitty.poclient.common.UpnpApp;
public class LoadImageAysnc {
private Object lock=new Object();
private static boolean mAllowLoad = true;
private static boolean firstLoad = true;
private int mStartLoadLimit = 0;
private int mStopLoadLimit = 0;
final static String SAVEPATH=mikfile();
private LrucacheUtil lrucache;
public LoadImageAysnc() {
lrucache = new LrucacheUtil();
}
/**
* 初始化缓存图片文件夹
*/
public static String mikfile(){
String path = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()+"/imagescache/";//获得sdcard路径
File filename=new File(path);
//ken 2013.10.21 尽量减少无用代码,保持代码整洁
// if(filename.isDirectory()){
//
//
// }else{
// try {
// filename.mkdir();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
if(!filename.isDirectory()){
try {
filename.mkdir();
} catch (Exception e) {
e.printStackTrace();
}
}
return path;
}
/**
* 从盒子取图片
* @param imgurl
* @return
*/
public Bitmap loadImage( final String imgkey, final String imgurl,final View view){
//如果有缓存则使用缓存中的图片
Bitmap bitmap = lrucache.getBitmap(imgkey);
if(bitmap!=null){
return bitmap;
}
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
Bitmap bitmap = (Bitmap) msg.obj;
//图片加载完成的回调函数,用于更新imageview
if(bitmap!=null){
//imageCallBack.imageLoaded(bitmap);
ImageView imageViewTag = (ImageView) view.findViewWithTag(imgkey);
if (imageViewTag != null) {
if (bitmap != null) {
if(bitmap.isRecycled()){
bitmap=null;
}else{
imageViewTag.setBackgroundDrawable(new BitmapDrawable(bitmap));}
for(int i=0;i<100;i++){
}
bitmap=null;
}
}
}
}
};
//异步图片下载方法
QueryTask.executorService.submit(
new Runnable() {
@Override
public void run() {
Log.i("download", mAllowLoad+"");
if(!mAllowLoad){
Log.i("download", "等待下载。。。。");
/* synchronized(lock){
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
Log.i("download","等待下载。。。。");
}else{
Log.i("download","正在下载。。。。");
String name = imgurl.substring(imgurl.lastIndexOf("/")+1);
File cachefile = new File(SAVEPATH+name);
// Bitmap bitmap = null;
Bitmap bm = null;
String md5code = "";
String namemd5code="";
if(cachefile.exists()){
try {
md5code = Md5Util.process(cachefile);
namemd5code = name.substring(0, name.lastIndexOf("."));
} catch (IOException e) {
e.printStackTrace();
}
if(namemd5code.equals(md5code)){
try{
bm = BitmapUtil.decodeScaleFile(cachefile.getAbsolutePath(), 150);
}catch(OutOfMemoryError e){
Log.i("kk","memoryerror:"+e);
}
if(bm!=null){
lrucache.putBitmap(imgkey, bm);
}
Message msg = handler.obtainMessage(0, bm);
msg.sendToTarget();
}else{
getboximages(imgkey, imgurl, handler);
}
}else{
getboximages(imgkey, imgurl, handler);
}
bm=null;
}
}
});
return null;
}
/**
* 从盒子取图片
* @param imgurl
* @return
*/
public Bitmap loadImageForUsbMusic(final String imgkey, final String imgurl, final ImageView usbMusicImageView) {
// 如果有缓存则使用缓存中的图片
Bitmap bitmap = lrucache.getBitmap(imgkey);
if (bitmap != null) {
return bitmap;
}
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Bitmap bitmap = (Bitmap) msg.obj;
// 图片加载完成的回调函数,用于更新imageview
if (bitmap != null) {
if (usbMusicImageView != null) {
if (bitmap != null) {
if (bitmap.isRecycled()) {
bitmap = null;
} else {
usbMusicImageView.setImageBitmap(bitmap);
}
// for (int i = 0; i < 100; i++) {
//
// }
bitmap = null;
}
}
}
}
};
// 异步图片下载方法
QueryTask.executorService.submit(new Runnable() {
@Override
public void run() {
Log.i("download", mAllowLoad + "");
if (!mAllowLoad) {
Log.i("download", "等待下载。。。。");
/*
* synchronized(lock){ try { lock.wait(); } catch
* (InterruptedException e) { // TODO Auto-generated catch
* block e.printStackTrace(); } }
*/
Log.i("download", "等待下载。。。。");
} else {
Log.i("download", "正在下载。。。。");
String name = imgurl.substring(imgurl.lastIndexOf("/") + 1);
File cachefile = new File(SAVEPATH + name);
// Bitmap bitmap = null;
Bitmap bm = null;
String md5code = "";
String namemd5code = "";
if (cachefile.exists()) {
try {
md5code = Md5Util.process(cachefile);
namemd5code = name.substring(0,
name.lastIndexOf("."));
} catch (IOException e) {
e.printStackTrace();
}
if (namemd5code.equals(md5code)) {
try {
bm = BitmapUtil.decodeScaleFile(
cachefile.getAbsolutePath(), 150);
} catch (OutOfMemoryError e) {
Log.i("kk", "memoryerror:" + e);
}
if (bm != null) {
lrucache.putBitmap(imgkey, bm);
}
Message msg = handler.obtainMessage(0, bm);
msg.sendToTarget();
} else {
getboximages(imgkey, imgurl, handler);
}
} else {
getboximages(imgkey, imgurl, handler);
}
bm = null;
}
}
});
return null;
}
//异步加载图片的方法(其实可以以任何形式得到图片)
public Bitmap loadImage(final String key, final String imageurl,final int sc,final boolean isReflection, final ImageCallBack imageCallBack)
{
//如果有缓存则使用缓存中的图片
Bitmap bitmap = lrucache.getBitmap(key);
if(bitmap!=null){
return bitmap;
}
//图片加载完成
final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg) {
Bitmap bitmap = (Bitmap) msg.obj;
//图片加载完成的回调函数,用于更新imageview
if(bitmap!=null){
if(!bitmap.isRecycled()){
imageCallBack.imageLoaded(bitmap);
}
}
}
};
//异步图片下载方法
QueryTask.executorService.submit(
new Runnable() {
@Override
public void run() {
String name = imageurl.substring(imageurl.lastIndexOf("/")+1);
File cachefile = new File(SAVEPATH+name);
Bitmap bitmap = null;
Bitmap bm = null;
String md5code = "";
String namemd5code="";
if(cachefile.exists()){
try {
md5code = Md5Util.process(cachefile);
namemd5code = name.substring(0, name.lastIndexOf("."));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(namemd5code.equals(md5code)){
bm = BitmapUtil.decodeScaleFile(cachefile.getAbsolutePath(), sc);
}else{
bm = BitmapUtil.loadImageFromUrl(imageurl,sc,SAVEPATH,name);
}
}else{
//cachefile.delete();
bm = BitmapUtil.loadImageFromUrl(imageurl,sc,SAVEPATH,name);
}
if(bm!=null){
if(isReflection){
bitmap =ImageUtil.createnewReflectedImage(bm);
}else{
bitmap=bm;
}
lrucache.putBitmap(key, bitmap);
bm=null;
}
Message msg = handler.obtainMessage(0, bitmap);
msg.sendToTarget();
}
});
return null;
}
//异步加载图片的方法(其实可以以任何形式得到图片)
public Bitmap loadImage(final String key,final int id,final int sc,final Resources res, final ImageCallBack imageCallBack)
{
//如果有缓存则使用缓存中的图片
Bitmap bitmap = lrucache.getBitmap(key);
if(bitmap!=null){
return bitmap;
}
//图片加载完成
final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg) {
Bitmap bitmap = (Bitmap) msg.obj;
//图片加载完成的回调函数,用于更新imageview
if(bitmap!=null){
imageCallBack.imageLoaded(bitmap);
}
}
};
//异步图片下载方法
QueryTask.executorService.submit(
new Runnable() {
@Override
public void run() {
Bitmap bitmap = BitmapUtil.decodeScaleRes(id, sc, res);
if(bitmap!=null){
lrucache.putBitmap(key, bitmap);
}
Message msg = handler.obtainMessage(0, bitmap);
msg.sendToTarget();
}
});
return null;
}
// 异步加载图片的方法无Handler
public Bitmap loadImageNohandler(final String key, final String imageurl, final int sc, final boolean isReflection, final ImageCallBack imageCallBack) {
// 如果有缓存则使用缓存中的图片
Bitmap bitmap = lrucache.getBitmap(key);
if (bitmap != null && !bitmap.isRecycled()) {
return bitmap;
}
// // 图片加载完成
// final Handler handler = new Handler() {
// @Override
// public void handleMessage(Message msg) {
// Bitmap bitmap = (Bitmap) msg.obj;
// // 图片加载完成的回调函数,用于更新imageview
// if (bitmap != null) {
// imageCallBack.imageLoaded(bitmap);
// }
// }
// };
// 异步图片下载方法
QueryTask.executorService.submit(new Runnable() {
@Override
public void run() {
String name = imageurl.substring(imageurl.lastIndexOf("/") + 1);
File cachefile = new File(SAVEPATH + name);
Bitmap bitmap = null;
Bitmap bm = null;
String md5code = "";
String namemd5code = "";
if (cachefile.exists()) {
try {
md5code = Md5Util.process(cachefile);
namemd5code = name.substring(0, name.lastIndexOf("."));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (namemd5code.equals(md5code)) {
bm = BitmapUtil.decodeScaleFile(cachefile.getAbsolutePath(), sc);
} else {
bm = BitmapUtil.loadImageFromUrl(imageurl, sc, SAVEPATH, name);
}
} else {
// cachefile.delete();
bm = BitmapUtil.loadImageFromUrl(imageurl, sc, SAVEPATH, name);
}
if (bm != null) {
if (isReflection) {
bitmap = ImageUtil.createnewReflectedImage(bm);
} else {
bitmap = bm;
}
lrucache.putBitmap(key, bitmap);
bm = null;
}
imageCallBack.imageLoaded(bitmap);
}
});
return null;
}
//回调接口
public interface ImageCallBack
{
public void imageLoaded(Bitmap bitmap);
}
/**
* 去盒子拿图片
*/
public void getboximages(final String imgkey, final String imgurl,final Handler handler){
ActionInvocation ai = new ActionInvocation(UpnpApp.boxControlService.getAction("GetImage"));
ai.setInput("Json","{imageurl:\""+imgurl+"\"}");
UpnpApp.upnpService.getControlPoint().execute(new ActionCallback(ai){
@Override
public void failure(ActionInvocation arg0, UpnpResponse arg1,
String arg2) {
Log.i("images", "失败");
}
@Override
public void success(ActionInvocation arg0) {
byte[] sycontent =(byte[])arg0.getOutput("Image").getValue();
Log.i("images",sycontent+"");
Bitmap bitmap=null;
if(sycontent!=null){
String name = imgurl.substring(imgurl.lastIndexOf("/")+1);
File cachefile = new File(SAVEPATH+name);
if(cachefile.exists()){
bitmap = BitmapUtil.decodeScaleFile(cachefile.getAbsolutePath(), 250);
}else{
bitmap = BitmapUtil.loadImageFromUrl(imgurl,250,SAVEPATH,name);
}
}
if(bitmap!=null){
lrucache.putBitmap(imgkey, bitmap);
}
Message msg = handler.obtainMessage(0, bitmap);
msg.sendToTarget();
}
//}
});
}
/**
* 加载图片
*/
public static void unlock(){
LoadImageAysnc.mAllowLoad=true;
LoadImageAysnc.firstLoad=true;
/* synchronized (lock) {
lock.notifyAll();
}*/
}
/**
* 停止加载图片,等待通知
*/
public static void lock(){
LoadImageAysnc.mAllowLoad=false;
LoadImageAysnc.firstLoad=false;
}
/**
* 重置
*/
public void restore(){
LoadImageAysnc.mAllowLoad = true;
LoadImageAysnc.firstLoad = true;
}
}