Parcourir la source

mainly fixed the avtar bug by disk cache

Wang il y a 10 ans
Parent
commit
cd52a85347

+ 65 - 7
app/src/main/java/cn/artimen/appring/app/DataManager.java

@@ -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)

+ 14 - 1
app/src/main/java/cn/artimen/appring/data/DataStorageHelper.java

@@ -162,11 +162,22 @@ public class DataStorageHelper implements ICurrentChildObserver,IChildrenObserve
         }
     }
 
+    public void prepare()
+    {
+        new Thread(new Runnable() {
+            @Override
+            public void run()
+            {
+                prepareAction();
+            }
+        }).start();
+    }
     /**
      * attention!this IO action may take a lot of time.
      */
-    public void prepare()
+    private void prepareAction()
     {
+        Logger.d(TAG,"start to prepare");
         List<ChildTrackInfo>infos=this.getChildTrackInfos();
         if(null==infos||infos.size()<1)
         {
@@ -182,11 +193,13 @@ public class DataStorageHelper implements ICurrentChildObserver,IChildrenObserve
             Bitmap rawBitmap=controller.get(info.getImageUrl());
             if(null!=rawBitmap)
             {
+                Logger.d(TAG,"rawBitmap is not null");
                 DataManager.getInstance().putAvatar(info.getImageUrl(), BitmapTools.toCircleBitmap(rawBitmap));
                 rawBitmap.recycle();
                 rawBitmap=null;
             }
         }
+        Logger.d(TAG,"end of prepare");
     }
 
 

+ 16 - 1
app/src/main/java/cn/artimen/appring/ui/avtivity/main/MainActivity.java

@@ -396,9 +396,24 @@ public class MainActivity extends ActionBarActivity implements View.OnClickListe
 
     }
 
-    private void initData()
+    private void useDiskCache()
     {
+        ChildTrackInfo lastCurrentInfo=DataStorageHelper.getInstance().getCurrentChildInfo();
+        if(null==lastCurrentInfo)
+        {
+            return;
+        }
+        String imageUrl=lastCurrentInfo.getImageUrl();
+        if(null==imageUrl)
+        {
+            return;
+        }
+        mChildAvatarImageView.setImageBitmap(DataManager.getInstance().getAvatar(imageUrl));
+    }
 
+    private void initData()
+    {
+        useDiskCache();
         /*
         babyTrackInfoAdapter=new BabyTrackInfoAdapter(MainActivity.this,null);
         childListView.setAdapter(babyTrackInfoAdapter);

+ 1 - 1
app/src/main/java/cn/artimen/appring/ui/avtivity/main/SplashActivity.java

@@ -203,7 +203,7 @@ public class SplashActivity extends BaseActivity {
         */
         mLogoImageView=(ImageView)findViewById(R.id.logoImageView);
 
-        //DataStorageHelper.getInstance().prepare();
+        DataStorageHelper.getInstance().prepare();
 
         initData();
 

+ 1 - 2
app/src/main/java/cn/artimen/appring/ui/fragment/main/LeftMenuFragment.java

@@ -126,7 +126,6 @@ public class LeftMenuFragment extends Fragment implements ICurrentChildObserver
         //mMultiViewPager.setAdapter(new PageAdapter(this.getActivity().getSupportFragmentManager()));
         refreshAdapter();
         mMultiViewPager.setCurrentItem(0);
-
         try
         {
             //viewPager.setPageTransformer(true,mTransFormer);
@@ -153,7 +152,7 @@ public class LeftMenuFragment extends Fragment implements ICurrentChildObserver
                      mListener.onChildSelected(position);
                  }
                  */
-                //this is a observer
+                //this is an observer
                 //refreshWatchRelatedUi();
             }
 

+ 1 - 1
readme.txt

@@ -1 +1 @@
-This branch is mainly used for main development.So any feature or bug-fix feature should be merged in this branch when they are completed.
+This branch is mainly used to fix avatar bug