2016-07-15 8 views
0

非常に遅い接続(GPRS)でディスクから画像をダウンロードしようとすると、非常に長く(約10分)、DISKから画像を取得する前にソケット例外が発生します。事前にPicasso SocketException

compile 'com.squareup.picasso:picasso:2.5.2' 
compile 'com.squareup.okhttp:okhttp:2.4.0' 

OkHttpClient client = new OkHttpClient(); 
    client.setCache(new Cache(context.getApplicationContext().getCacheDir(), Integer.MAX_VALUE)); 
    client.setConnectTimeout(5, TimeUnit.SECONDS); // connect timeout 
    client.setReadTimeout(15, TimeUnit.SECONDS); // socket timeout 
    Picasso.Builder builder = new Picasso.Builder(this); 
    builder.downloader(new OkHttpDownloader(client)); 
    Picasso built = builder.build(); 
    built.setIndicatorsEnabled(BuildConfig.DEBUG); 
    built.setLoggingEnabled(BuildConfig.DEBUG); 
    Picasso.setSingletonInstance(built); 

enter image description here

enter image description here

おかげ

PS:私の悪い英語

+0

イメージをダウンロードしているサーバーから接続がリセットされています。 Picassoは一度イメージをダウンロードしてから、ディスクキャッシュにキャッシュします。ここで、最初の試行自体は遅い接続のために拒否されています。 – Kushan

+0

接続のタイムアウト値を15分と増やしてみてください – Kushan

+0

@クーガンありがとう、ありがとうございました。私はすでにイメージを初めてダウンロードしています。このエラーは、ディスクからイメージ(すでにダウンロード済み)を取得しようとする2回目に表示されます。 – Louis

答えて

1

自分のOKHTTP3ダウンローダでカスタムPicasaを使用しましたが、ディスクキャッシュのタイムアウトを6000s(100mins)に設定しました。 LRU->メモリとディスクキャッシュ - >キャッシュの両方で必要に応じて変更してください。

package com.example.project.recommendedapp; 


import android.content.Context; 
import android.util.Log; 

import com.jakewharton.picasso.OkHttp3Downloader; 
import com.squareup.picasso.LruCache; 
import com.squareup.picasso.Picasso; 

import java.io.File; 
import java.io.IOException; 
import java.util.concurrent.TimeUnit; 

import okhttp3.Cache; 
import okhttp3.OkHttpClient; 

//Singleton Class for Picasso Downloading, Caching and Displaying Images Library 
public class PicassoSingleton { 

private static Picasso mInstance; 
private static long mDiskCacheSize = 50*1024*1024; //Disk Cache limit 50mb 

//private static int mMemoryCacheSize = 50*1024*1024; //Memory Cache 50mb, not currently using this. Using default implementation 

private static OkHttpClient mOkHttp3Client; //OK Http Client for downloading 
private static OkHttp3Downloader okHttp3Downloader; 
private static Cache diskCache; 
private static LruCache lruCache;//not using it currently 


public static synchronized Picasso getSharedInstance(Context context) 
{ 
    if(mInstance == null) { 
     if (context != null) { 
      //Create disk cache folder if does not exist 
      File cache = new File(context.getApplicationContext().getCacheDir(), "picasso_cache"); 
      if (!cache.exists()) { 
       cache.mkdirs(); 
      } 

      diskCache = new Cache(cache, mDiskCacheSize); 
      //lruCache = new LruCache(mMemoryCacheSize);//not going to be using it, using default memory cache currently 
      lruCache = new LruCache(context); // This is the default lrucache for picasso-> calculates and sets memory cache by itself 

      //Create OK Http Client with retry enabled, timeout and disk cache 
      mOkHttp3Client = new OkHttpClient.Builder().cache(diskCache).connectTimeout(6000, TimeUnit.SECONDS).build(); //100 min cache timeout 



      //For better performence in Memory use set memoryCache(Cache.NONE) in this builder (If needed) 
      mInstance = new Picasso.Builder(context).memoryCache(lruCache).downloader(new OkHttp3Downloader(mOkHttp3Client)).indicatorsEnabled(true).build(); 

     } 
    } 
    return mInstance; 
} 

public static void deletePicassoInstance() 
{ 
    mInstance = null; 
} 

public static void clearLRUCache() 
{ 
    if(lruCache!=null) { 
     lruCache.clear(); 
     Log.d("FragmentCreate","clearing LRU cache"); 
    } 

    lruCache = null; 

} 

public static void clearDiskCache(){ 
    try { 
     if(diskCache!=null) { 
      diskCache.evictAll(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    diskCache = null; 

} 
} 
+0

setReadTimeout(xyz、TimeUnit.SECONDS);を設定できます。同様に – Kushan

+0

詳細な回答ありがとう – Louis

0

については申し訳ありませんあなたのサーバーが適切なキャッシュ・ヘッダーせずにファイルを送信している可能性があります。この場合、OKHTTPはイメージをキャッシュしません。

ピカソにはディスクキャッシュがありません。これは、その機能のために使用しているHTTPクライアントに委ねます(キャッシュ制御のHTTPキャッシュセマンティクスに依存します)。したがって

Using Picasso with custom disk cache

次の時間、それはダウンロードを再試行します。私はDropBox共有リンクからダウンロードした画像でこれが起こるのを見ました。

httpレスポンスはイメージではなくキャッシュされます。したがって、レスポンスにサーバーから送信された適切なヘッダーがない場合、キャッシュされません。これが正しいかどうかを確認してください。別の画像ソースを使用してテストしてみてください。

+0

http://stackoverflow.com/questions/35806571/picasso-doesnt-cache-image-on-disk - >ここでの説明、同じ問題を参照してください – Kushan

+0

私は高速接続を試みるとき、それは正しく動作し、デバッグインジケータは青色です(ディスクから)。 – Louis

+0

可能性がありますhttpresponseタイムアウト。私が言ったように、キャッシュはResponseCacheまたはOkResponseCacheで行われます。遅い接続のために応答キャッシュヘッダーがタイムアウトすると、ディスクキャッシュから追い出されます – Kushan

関連する問題