کلیدستان

نسخه‌ی کامل: کش برای وب ویو
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام دوستان
 چگونه میوشد برای وب ویو کش درست کرد؟

یعنی وفتی کاربر یکبار وارود وب ویو می شود وبارگذاری انجام میوشد وبعد زا خروج دوباره به بارگذاری مجدد محتوی داحل وب ویو از اینترنت نباشد.
(۱۳۹۴/۱۲/۰۸, ۱۰:۰۲ ق.ظ)sohrabjam نوشته: [ -> ]سلام دوستان
 چگونه میوشد برای وب ویو کش درست کرد؟

یعنی وفتی کاربر یکبار وارود وب ویو می شود وبارگذاری انجام میوشد وبعد زا خروج دوباره به بارگذاری مجدد محتوی داحل وب ویو از اینترنت نباشد.

سلام
اگه اشتباه نکرده باشم شما میخواید یه حافظه درست کنید برای webView که در اجرای دوباره آن به آخرین آدرسی که درونش بوده بره.
شما برای این کار دوتا اکتیویتی میخواهید. و یک کلاس از نوع Application  که کار ذخیره را انجام دهد.

قبل از هرکاری دسترسی های زیر رو به برنامتون بدید
کد پی‌اچ‌پی:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 
 <uses-permission android:name="android.permission.INTERNET"/>
 
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 


بعد یک کلاس به ایجاد کنید و اون رو از Application مشتق کنید. مثل کلاس زیر که بعنوان نمونه میذارمش
کد پی‌اچ‌پی:
import java.io.File;
 
import android.app.Application;
import android.os.Environment;
 
public class 
ApplicationExt extends Application
{
 
 protected File extStorageAppBasePath;
 
  
  protected File extStorageAppCachePath
;
 
 
 @Override
  public void onCreate
()
 
 {
 
   super.onCreate();
 
 
   if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
 
   {
 
     File externalStorageDir Environment.getExternalStorageDirectory();
 
        
      if 
(externalStorageDir != null)
 
     {
 
       extStorageAppBasePath = new File(externalStorageDir.getAbsolutePath() +
 
         File.separator "Android" File.separator "data" +
 
         File.separator getPackageName());
 
     }
 
  
      if 
(extStorageAppBasePath != null)
 
     {
 
       extStorageAppCachePath = new File(extStorageAppBasePath.getAbsolutePath() +
 
         File.separator "cache");
 
  
        boolean isCachePathAvailable 
true;
 
        
        if 
(!extStorageAppCachePath.exists())
 
       {
 
         isCachePathAvailable extStorageAppCachePath.mkdirs();
 
       }
 
        
        if 
(!isCachePathAvailable)
 
       {
 
         extStorageAppCachePath null;
 
       }
 
     }
 
   }
 
 }
 
  
  
@Override
  public File getCacheDir
()
 
 {
 
    
    if 
(extStorageAppCachePath != null)
 
   {
 
     return extStorageAppCachePath;
 
   }
 
   else
    
{
 
     return super.getCacheDir();
 
   }
 
 }

اکتیویتی اول را بصورت زیر تغیر بدید
کد پی‌اچ‌پی:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical">
 
  <Button android:id="@+id/startSecondActivityBtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="Start second activity"/>
 
  <WebView android:id="@+id/webView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>
 
</LinearLayout> 


و کلاس متناطر آن دستورات زیر را پیاده سازی کنید

کد پی‌اچ‌پی:
import java.io.File;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
 
public class 
MainActivity extends Activity implements OnClickListener
{
 
 protected WebView webView;
 
 protected Button startSecondActivityBtn;
 
  
  
@Override
  public void onCreate
(Bundle savedInstanceState)
 
 {
 
   super.onCreate(savedInstanceState);
 
   setContentView(R.layout.main);
 
    
    webView 
= ((WebView)findViewById(R.id.webView));
 
   startSecondActivityBtn = ((Button)findViewById(R.id.startSecondActivityBtn));
 
 
   startSecondActivityBtn.setOnClickListener(this);
 
    
    webView
.getSettings().setSupportZoom(true);
 
   webView.getSettings().setBuiltInZoomControls(true);
 
   webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
 
   webView.setScrollbarFadingEnabled(true);
 
   webView.getSettings().setLoadsImagesAutomatically(true);
 
 
   webView.setWebViewClient(new WebViewClient());
 
 
   webView.loadUrl("http://www.google.com");
 
 }
 
 
 @Override
  protected void onDestroy
()
 
 {
 
   webView.clearCache(true);
 
    
    super
.onDestroy();
 
 }
 
  
  
@Override
  public File getCacheDir
()
 
 {
 
    
    return getApplicationContext
().getCacheDir();
 
 }
 
 
 @Override
  public void onClick
(View v)
 
 {
 
   if (== startSecondActivityBtn)
 
   {
 
     Intent intent = new Intent(thisSecondActivity.class);
 
     startActivity(intent);
 
   }
 
 }



حالا اکتیوتی دوم رو بصورت زیر تغییر بره
کد پی‌اچ‌پی:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical">
 
  <WebView android:id="@+id/webView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>
 
</LinearLayout> 


و در کلاس متناطر با کدهای زیر را قرار بدید

کد پی‌اچ‌پی:
import java.io.File;
 
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
 
public class 
SecondActivity extends Activity
{
 
 protected WebView webView;
 
  
  
@Override
  public void onCreate
(Bundle savedInstanceState)
 
 {
 
   super.onCreate(savedInstanceState);
 
   setContentView(R.layout.second);
 
    
    webView 
= ((WebView)findViewById(R.id.webView));
 
    
    webView
.getSettings().setSupportZoom(true);
 
   webView.getSettings().setBuiltInZoomControls(true);
 
   webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
 
   webView.setScrollbarFadingEnabled(true);
 
   webView.getSettings().setLoadsImagesAutomatically(true);
 
 
   webView.setWebViewClient(new WebViewClient());
 
 
   webView.loadUrl("http://www.google.com");
 
 }
 
 
 @Override
  public File getCacheDir
()
 
 {
 
    
    return getApplicationContext
().getCacheDir();
 
 }



از برنامه اجرا بگیرید. ببینید نتیجه چطوریه. امیدوارم همون چیزی باشه که شما میخواهید.
نکته ای که باید بگم تا حد امکان از اندروید های پایین تر از 3 استفاده نکنید. تا نتیجه به خوبی نمایش داده بشه

موفق باشید
سلام  دوست عزیز

 خیلی ممنون از جواب  کامل و مفید شما

متوجه نشدم چرا دوتا اکتویتی میخواهم ؟


اکتویتی دوم چکار میکند ؟

فقط برای تست به نظر میرسد
(۱۳۹۴/۱۲/۰۸, ۰۶:۴۲ ب.ظ)sohrabjam نوشته: [ -> ]سلام  دوست عزیز

 خیلی ممنون از جواب  کامل و مفید شما

متوجه نشدم چرا دوتا اکتویتی میخواهم ؟


اکتویتی دوم چکار میکند ؟

فقط برای تست به نظر میرسد

سلام. 
ممنون از لطفتون. بله اکتیویتی دوم طبق کدها نشان دهنده کش اکتیویتی اول هستش
متاسفانه این کش عملا کارایی چندانی ندارد

با اینکه فالیها را ذخیره میکند و با بستن وب ویو انها را نگه میدارد  ولی هنگا باز کردن دوباره وب ویو تغییری در سرعت لود ایجاد نیمشود .
در صورت قطع اینترنت هم که نمیتواند دوباره بازخوانی کند.

چرا  با اینکه فایلها را کش کرده باز هم نمیتواند از ان استفاده کند؟ Undecided
از رفقا

کسی کدی  اموزشی لینکی سراغ ندارد که وب ویو از فایل های کش شده در حالت افلاین هم استفاده کند
سلام

برای فعال کردن offline cache مربوط به webView میتونید از کدهای زیر استفاده کنید
کد پی‌اچ‌پی:
WebView webView = new WebViewcontext );
webView.getSettings().setAppCacheMaxSize1024 1024 ); // 5MB
webView.getSettings().setAppCachePathgetApplicationContext().getCacheDir().getAbsolutePath() );
webView.getSettings().setAllowFileAccesstrue );
webView.getSettings().setAppCacheEnabledtrue );
webView.getSettings().setJavaScriptEnabledtrue );
webView.getSettings().setCacheModeWebSettings.LOAD_DEFAULT ); // load online by default

if ( !isNetworkAvailable() ) { // loading offline
 
   webView.getSettings().setCacheModeWebSettings.LOAD_CACHE_ELSE_NETWORK );
}

webView.loadUrl"http://www.google.com" ); 

چک کردن دسترسی به شبکه
کد پی‌اچ‌پی:
private boolean isNetworkAvailable() {
 
   ConnectivityManager connectivityManager = (ConnectivityManagergetSystemServiceCONNECTIVITY_SERVICE );
 
   NetworkInfo activeNetworkInfo connectivityManager.getActiveNetworkInfo();
 
   return activeNetworkInfo != null && activeNetworkInfo.isConnected();


دسترسی های مورد نیاز
کد پی‌اچ‌پی:
<uses-permission android:name="android.permission.INTERNET"/>
<
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<
uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>