|
@@ -60,16 +60,18 @@ public class DataManager implements Serializable,ICurrentChildSubject,
|
|
|
private List<IAvatarObserver>mAvatarObservers=new ArrayList<>();
|
|
|
private List<IChildrenObserver>mChildrenObservers=new ArrayList<>();
|
|
|
|
|
|
-
|
|
|
//private Lock mLoginLock=new ReentrantLock();
|
|
|
|
|
|
//Attention! we only need one ReadWriteLock instead of two! Because
|
|
|
private ReadWriteLock mChildRWLock=new ReentrantReadWriteLock();
|
|
|
private ReadWriteLock mChildrenRWLock=new ReentrantReadWriteLock();
|
|
|
+ private ReadWriteLock mAvatarCacheRWLock=new ReentrantReadWriteLock();
|
|
|
+
|
|
|
|
|
|
private Map<String,Bitmap>mAvatarCache=new HashMap<>();
|
|
|
+ //private DisplayImageOptions mOptions;
|
|
|
|
|
|
- private DisplayImageOptions mOptions;
|
|
|
+ private boolean mIsFirst=true;
|
|
|
|
|
|
/**
|
|
|
* This is simple but not quite resonable and flexible
|
|
@@ -164,6 +166,7 @@ public class DataManager implements Serializable,ICurrentChildSubject,
|
|
|
{
|
|
|
mChildRWLock.writeLock().unlock();
|
|
|
}
|
|
|
+ Logger.d(TAG,"end of set current child info");
|
|
|
|
|
|
}
|
|
|
|
|
@@ -232,17 +235,66 @@ public class DataManager implements Serializable,ICurrentChildSubject,
|
|
|
|
|
|
public Bitmap getAvatar(String imageUrl)
|
|
|
{
|
|
|
- return mAvatarCache.get(imageUrl);
|
|
|
+ mAvatarCacheRWLock.readLock().lock();
|
|
|
+ try
|
|
|
+ {
|
|
|
+ return mAvatarCache.get(imageUrl);
|
|
|
+ }
|
|
|
+ catch(Exception ex)
|
|
|
+ {
|
|
|
+ ex.printStackTrace();
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ mAvatarCacheRWLock.readLock().unlock();
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
public void putAvatar(String imageUrl,Bitmap circleBmp)
|
|
|
{
|
|
|
- mAvatarCache.put(imageUrl,circleBmp);
|
|
|
+ mAvatarCacheRWLock.writeLock().lock();
|
|
|
+ try
|
|
|
+ {
|
|
|
+ mAvatarCache.put(imageUrl,circleBmp);
|
|
|
+ }
|
|
|
+ catch(Exception ex)
|
|
|
+ {
|
|
|
+ ex.printStackTrace();
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ mAvatarCacheRWLock.writeLock().unlock();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ private void clearAvatarCache()
|
|
|
+ {
|
|
|
+ mAvatarCacheRWLock.writeLock().lock();
|
|
|
+ mAvatarCache.clear();
|
|
|
+ mAvatarCacheRWLock.writeLock().unlock();
|
|
|
}
|
|
|
+ */
|
|
|
|
|
|
- private void refreshAvatarCache()
|
|
|
+ /**
|
|
|
+ * Considering the state of mIsFirst and mAvatarCache, synchronized is proper here.
|
|
|
+ */
|
|
|
+ private synchronized void clearAvatarCache()
|
|
|
{
|
|
|
+ if(mIsFirst)
|
|
|
+ {
|
|
|
+ mIsFirst=false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
mAvatarCache.clear();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void refreshAvatarCache()
|
|
|
+ {
|
|
|
+ clearAvatarCache();
|
|
|
/*
|
|
|
if(null==mOptions)
|
|
|
{
|
|
@@ -257,7 +309,10 @@ public class DataManager implements Serializable,ICurrentChildSubject,
|
|
|
@Override
|
|
|
public void onResponse(Bitmap response) {
|
|
|
Bitmap circleBmp=BitmapTools.toCircleBitmap(response);
|
|
|
- mAvatarCache.put(imageUrl, circleBmp);
|
|
|
+ //mAvatarCache.put(imageUrl, circleBmp);
|
|
|
+
|
|
|
+ putAvatar(imageUrl,circleBmp);
|
|
|
+
|
|
|
response.recycle();
|
|
|
response=null;
|
|
|
notifyAvatarObserver(imageUrl, circleBmp);
|
|
@@ -307,9 +362,12 @@ public class DataManager implements Serializable,ICurrentChildSubject,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void initConfig() {
|
|
|
+ /*
|
|
|
+ private void initConfig()
|
|
|
+ {
|
|
|
mOptions = ConfigUtils.initOptions();
|
|
|
}
|
|
|
+ */
|
|
|
|
|
|
|
|
|
public void removeSelectedChildInfo(int pos)
|