2016-07-12 5 views
1

Ich möchte 3 zeigen fragments in meinem Activity und Daten von json in jedem fragments! Ich muss Websitedaten in Recyclerview mit OkHTTP v3 Bibliothek zeigen.
Ich möchte diese Daten für offline zeigen, ich meine, wenn Benutzer Daten/WLAN deaktivieren zeigen Sie diese Daten für offline. aber ich möchte nicht verwenden SQLite-Datenbank!
Für diese Idee i okHttpClientcache verwenden, aber setCache für den Kunden nicht gefunden und zeigen Sie mir diesen Fehler: Image linkWie setCache für Online-Daten OkHttpClient in Android verwenden

MainActivity Codes:

public class MainActivity extends AppCompatActivity { 

    private RecyclerView recyclerView; 
    private ArrayList<AndroidVersion> data; 
    private DataAdapter adapter; 
    private static Context context; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     context = this; 

     initViews(); 
    } 

    private void initViews() { 
     recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view); 
     recyclerView.setHasFixedSize(true); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); 
     recyclerView.setLayoutManager(layoutManager); 
     loadJSON(); 
    } 

    private void loadJSON() { 

     OkHttpClient client = new OkHttpClient(); 
     client.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR); 

     //setup cache 
     File httpCacheDirectory = new File(context.getCacheDir(), "responses"); 
     int cacheSize = 10 * 1024 * 1024; // 10 MiB 
     Cache cache = new Cache(httpCacheDirectory, cacheSize); 

     //add cache to the client 
     client.setCache(cache); 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://api.learn2crack.com") 
       .client(client) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     RequestInterface request = retrofit.create(RequestInterface.class); 
     Call<JSONResponse> call = request.getJSON(); 
     call.enqueue(new Callback<JSONResponse>() { 
      @Override 
      public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) { 

       JSONResponse jsonResponse = response.body(); 
       data = new ArrayList<>(Arrays.asList(jsonResponse.getAndroid())); 
       adapter = new DataAdapter(data); 
       recyclerView.setAdapter(adapter); 
      } 

      @Override 
      public void onFailure(Call<JSONResponse> call, Throwable t) { 
       Log.d("Error", t.getMessage()); 
      } 
     }); 
    } 

    private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() { 
     @Override 
     public okhttp3.Response intercept(Chain chain) throws IOException { 
      okhttp3.Response originalResponse = chain.proceed(chain.request()); 
      if (isNetworkAvailable(context)) { 
       int maxAge = 60; // read from cache for 1 minute 
       return originalResponse.newBuilder() 
         .header("Cache-Control", "public, max-age=" + maxAge) 
         .build(); 
      } else { 
       int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale 
       return originalResponse.newBuilder() 
         .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) 
         .build(); 
      } 
     } 
    }; 

    public static boolean isNetworkAvailable(Context context) { 
     ConnectivityManager cm = 
       (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     return activeNetwork != null && 
       activeNetwork.isConnectedOrConnecting(); 
    } 

} 

Wie ich diese und okHttpClient Cache verwenden zu beheben ?

Antwort

7

Aus dem Screenshot ist ersichtlich, dass Sie eine veraltete Version von OkHttp verwenden. Nachrüstung 2 erfordert OkHttp 3. (Die neueste Version ist 3.4.1.)

Auch, um den Cache auf dem Client in OkHttp 3, new OkHttpClient.Builder().cache(cache).build().