public
class
SyncImageLoaderUtil
{
private
Object
lock =
new
Object();
private
boolean
mAllowLoad
=
true
;
private
boolean
firstLoad
=
true
;
private
int
mStartLoadLimit
=
0
;
private
int
mStopLoadLimit
=
0
;
final
Handler
handler =
new
Handler();
private
LruCache<String,Bitmap>
mMemoryCache;
RunInOtherThread
runInOutherThread;
public
SyncImageLoaderUtil(Context
context) {
super
();
int
memClass
= ((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
int
cacheSize
=
1024
*
1024
*memClass
/
8
;
mMemoryCache
=
new
LruCache<String,
Bitmap>(cacheSize){
@Override
protected
int
sizeOf(String
key, Bitmap value) {
return
value.getRowBytes();
}
};
runInOutherThread
=
new
RunInOtherThread();
runInOutherThread.start();
}
public
interface
OnImageLoadListener
{
public
void
onImageLoad(Integer
t, Drawable drawable);
public
void
onError(Integer
t);
}
public
void
setLoadLimit(
int
startLoadLimit,
int
stopLoadLimit)
{
if
(startLoadLimit
> stopLoadLimit) {
return
;
}
mStartLoadLimit
= startLoadLimit;
mStopLoadLimit
= stopLoadLimit;
}
public
void
restore()
{
mAllowLoad
=
true
;
firstLoad
=
true
;
}
public
void
lock()
{
mAllowLoad
=
false
;
firstLoad
=
false
;
}
public
void
unlock()
{
mAllowLoad
=
true
;
synchronized
(lock)
{
lock.notifyAll();
}
}
public
void
loadImage(Integer
t, String imageUrl,
OnImageLoadListener
listener) {
final
OnImageLoadListener
mListener = listener;
final
String
mImageUrl = imageUrl;
final
Integer
mt = t;
runInOutherThread.getHandler().post(
new
Runnable()
{
@Override
public
void
run()
{
if
(!mAllowLoad)
{
synchronized
(lock)
{
try
{
lock.wait();
}
catch
(InterruptedException
e) {
e.printStackTrace();
}
}
}
if
(mAllowLoad
&& firstLoad) {
loadImage(mImageUrl,
mt, mListener);
}
if
(mAllowLoad
&& mt <= mStopLoadLimit && mt >= mStartLoadLimit) {
loadImage(mImageUrl,
mt, mListener);
}
}
});
}
private
void
loadImage(
final
String
mImageUrl,
final
Integer
mt,
final
OnImageLoadListener
mListener) {
if
(mImageUrl!=
null
&&
mMemoryCache.get(mImageUrl)!=
null
)
{
final
Drawable
d =
new
BitmapDrawable(mMemoryCache.get(mImageUrl));
if
(d
!=
null
)
{
handler.post(
new
Runnable()
{
@Override
public
void
run()
{
if
(mAllowLoad)
{
mListener.onImageLoad(mt,
d);
}
}
});
return
;
}
}
try
{
final
Drawable
d = loadImageFromUrl(mImageUrl);
if
(d
!=
null
)
{
mMemoryCache.put(mImageUrl,
((BitmapDrawable)d).getBitmap());
}
handler.post(
new
Runnable()
{
@Override
public
void
run()
{
if
(mAllowLoad)
{
mListener.onImageLoad(mt,
d);
}
}
});
}
catch
(IOException
e) {
handler.post(
new
Runnable()
{
@Override
public
void
run()
{
mListener.onError(mt);
}
});
e.printStackTrace();
}
}
public
static
Drawable
loadImageFromUrl(String url)
throws
IOException
{
if
(Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
{
File
f =
new
File(Environment.getExternalStorageDirectory()
+
"/Weiyu/pic/"
+
MD5Util.getMD5(url.getBytes()));
if
(f.exists())
{
FileInputStream
fis =
new
FileInputStream(f);
Drawable
d = Drawable.createFromStream(fis,
"src"
);
return
d;
}
URL
m =
new
URL(url);
InputStream
i = (InputStream) m.getContent();
DataInputStream
in =
new
DataInputStream(i);
FileOutputStream
out =
new
FileOutputStream(f);
byte
[]
buffer =
new
byte
[
1024
];
int
byteread
=
0
;
while
((byteread
= in.read(buffer)) != -
1
)
{
out.write(buffer,
0
,
byteread);
}
in.close();
out.close();
return
loadImageFromUrl(url);
}
else
{
URL
m =
new
URL(url);
InputStream
i = (InputStream) m.getContent();
Drawable
d = Drawable.createFromStream(i,
"src"
);
return
d;
}
}
}