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;
}
}
}
相关推荐
AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...
Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631
android listView图片异步加载(拖动时不加载,双缓存)
ListView 动态加载,滑动加载,源代码案例
android Listview下拉刷新 上拉(滑动分页)加载更多 高仿新浪微博下拉刷新,同时实现了滑动加载下一页
ListView每页加载10条数据,当滑动到页尾时自动加载下面的数据。
ListView优化及加载图片时内存溢出
ListView与BaseAdapter的配套使用 理解android 中adapter适配的作用 以及ListView的优化方式
Android实现ListView异步加载图片
Android ListView异步加载图片,优化滚动效果,不卡顿、流畅显示。主要给新人了解ListView和AsyncTask、Json等使用。
Android 实现ListView滚动到底部自动加载数据
很多朋友在Android开发listview过程中都会碰到问题 比如从网上下载图片显示在界面 如果图片稍微大一点就会出现oom 或者显示的时候很容易出现图片闪烁等 这个项目能帮你解决
Android Listview异步加载图片,图片错位解决方案
android listview滑动到底部加载更多数据
Android中ListView全面完美的网络图片的异步加载,两种加载方式,利用了LruCache缓存,动态加载,只加载可见部分的图片.
①ListView异步加载图片的方式 ②给ImageView设置Tag,解决图片覆盖问题 ③采用LruCache缓存已经加载过的图片 ④当ListView滚动时不加载图片,滚动停止时才加载...⑤当ListView加载图片时只加载当前屏幕内可见的条目
LruCache 通过key--value 键值对的形式存储数据,通过指定一个最大值来限制其内容的数量(LruCache, value>(int maxSize)),每当一个value值被访问时移动到队列的头部,当LruCache中的value值达到上限时,再加入一...
公司有个项目要用到类似手机QQ聊天记录列表ListView左右滑动后改变item的效果,网上没找到好的代码,偶然在安卓巴士的开源站http://d.apkbus.com/里面找到了SwipeToDismiss的源码...改成自己的显示另一个view的效果就行...
AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度