2016-11-16 67 views
1

我在我的android應用程序中使用畢加索進行圖片緩存。但每當我打開應用程序的圖像開始從服務器加載。但我想從磁盤使用緩存的圖像,同時它也應該檢查服務器上的新圖像。和whatsapp一樣。使用piccaso進行圖片緩存,支持離線和在線兩種

如果我使用網絡策略脫機,它不會從服務器加載新圖像,它只是使用脫機圖像。

url = Static.url+"users/image?id="+id; 
    profileImg = R.drawable.user; 
    Picasso.with(activity) 
      .load(url) 
      .placeholder(profileImg) 
      .into(imageView, new Callback() { 
       @Override 
       public void onSuccess() { 
        Picasso.with(activity) 
          .load(url) 
          .networkPolicy(NetworkPolicy.OFFLINE) 
          .placeholder(profileImg) 
          .error(profileImg) 
          .into(imageView); 
       } 
       @Override 
       public void onError() { 
        // Try again online if cache failed 
       } 
      }); 

上述代碼正在工作,但圖像加載仍然不是很快。應該立即從緩存中加載圖像,並且應該在同一時刻在線檢查新圖像。

請指導。

+0

後你已經嘗試 – SaravInfern

回答

1

您可以使用此解決方法:

Picasso.with(context) 
        .load(Uri.parse("https://yoururl.com")) 
        .into(holder.storyBigThumb, new Callback() { 
         @Override 
         public void onSuccess() { 

         } 

         @Override 
         public void onError() { 
          // Try again online if cache failed 
          Picasso.with(context) 
            .load(Uri.parse("https://yoururl.com")) 
          .networkPolicy(NetworkPolicy.OFFLINE) 
          .placeholder(R.drawable.user_placeholder) 
          .error(R.drawable.user_placeholder_error) 
            .into(holder.storyBigThumb); 
         } 
        }); 

畢加索將嘗試從服務器獲取一個新的形象,如果失敗的話,它會從緩存

+0

圖像應該從高速緩存加載第一則應該在網上查詢,但它不是從緩存中.. – Suresh

1

您可以使用okhttp來實現此目的。

在build.gradle文件中添加compile 'com.squareup.okhttp:okhttp:2.4.0'

創建一個擴展Application的類。例如:

public class YourApp extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     Picasso.Builder builder = new Picasso.Builder(this); 
     builder.downloader(new OkHttpDownloader(this, Integer.MAX_VALUE)); 
     Picasso built = builder.build(); 
     built.setIndicatorsEnabled(true); 
     built.setLoggingEnabled(true); 
     Picasso.setSingletonInstance(built); 
    } 
} 

現在,你可以簡單地使用在Activity下面的代碼:

Picasso.with(YourActivity.this).load(imageLink).networkPolicy(NetworkPolicy.OFFLINE).into(cover_image, new Callback() { 
        @Override 
        public void onSuccess() {      } 
        @Override 
        public void onError() { 
         Picasso.with(YourActivity.this).load(imageLink).into(cover_image); 
        } 
       }); 

這一切。我認爲上面的代碼很容易理解。

1

首先畢加索自動捕捉圖像,其次如果你想要做那個加載離線,然後嘗試加載在線的東西,你需要使用兩個調用圖像加載,第一個使用DiskPolicy從磁盤加載和第二個使用NetworkPolicy強制呼叫加載並從網上捕獲。

1

如果您的設備處於脫機狀態,則執行第一次加載時效率低下。只需在加載之前檢查網絡連接,然後應用正確的networkPolicy(脫機與否)。

RequestCreator requestCreator = Picasso.with(context).load(url); 
if (!Utils.isNetworkAvailable(context)) { 
    // offline mode: load from cache directly 
    requestCreator.networkPolicy(NetworkPolicy.OFFLINE); 
} 
requestCreator.into(imageView); 

isNetworkAvailable功能:

public static boolean isNetworkAvailable(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
    // if no network is available networkInfo will be null 
    // otherwise check if we are connected 
    return networkInfo != null && networkInfo.isConnected(); 
}