Загружать кэш в Android Webview, когда не подключен к Интернету, иначе показывать контент с сервера при подключении к Интернету - PullRequest
3 голосов
/ 22 августа 2011

У меня есть это приложение, которое использует webview для визуализации кэшированного содержимого, когда оно находится в автономном режиме, и показывает веб-страницу с сервера при подключении к Интернету ...

Фрагменты кода показаны ниже.Это происходит сбой при запуске приложения.

Я не могу понять, что происходит не так.я также установил android разрешения на использование: name = "android.permission.INTERNET" в файле манифеста.

package com.html5webappcache.android;

import android.app.Activity;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebStorage.QuotaUpdater;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.TextView;

public class HTML5WebAppCacheTestActivity extends Activity {
    final Activity activity = this;
    private ConnectivityManager cm;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Adds Progrss bar Support
        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.main );

        getWindow().setFeatureInt( Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); 

        WebView engine=(WebView)findViewById(R.id.web_engine);
        engine.getSettings().setJavaScriptEnabled(true);
        engine.getSettings().setBuiltInZoomControls(true);
        engine.getSettings().setLoadsImagesAutomatically(true);
        engine.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        engine.setInitialScale(1);

        engine.setWebChromeClient(new WebChromeClient() {
              @Override
                 public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota,QuotaUpdater quotaUpdater)
                 {
                       quotaUpdater.updateQuota(spaceNeeded * 2);
                 }
              public void onProgressChanged(WebView view, int progress)
              {
                  activity.setTitle("Loading...");
                  activity.setProgress(progress * 100);



                  if(progress == 100)
                  { activity.setTitle(R.string.app_name);

                  }
              }
           });
        engine.getSettings().setDomStorageEnabled(true);
       // Set cache size to 8 mb by default. should be more than enough
        engine.getSettings().setAppCacheMaxSize(1024*1024*8);
        engine.getSettings().setAppCachePath("/data/data/com.html5webappcache.android/cache");
        engine.getSettings().setAllowFileAccess(true);
        engine.getSettings().setAppCacheEnabled(true);
        engine.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

         cm = (ConnectivityManager) this.getSystemService(Activity.CONNECTIVITY_SERVICE);
         if(cm.getActiveNetworkInfo().isConnected())
         {
         engine.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
         engine.loadUrl("http://www.bifter.co.uk/");
         }
             else{
                engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
                 engine.loadUrl("http://www.bifter.co.uk/");
             }











    }
}

Ответы [ 4 ]

1 голос
/ 27 ноября 2011
webview1 = (WebView) findViewById(R.id.webView1);

    WebSettings webSettings = webview1.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setCacheMode(WebSettings.LOAD_NORMAL); <--- CHANGE THIS
    webSettings.setAppCacheMaxSize(1024*1024*8);
    webview1.addJavascriptInterface(new JavaScriptInterface(this),
            "Android");
    webview1.setWebViewClient(new MyWebViewClient());
    webview1.setBackgroundColor(Color.BLACK);


    try {
        current_url = "http://........link";
        webview1.loadUrl(current_url);
    } catch (Exception e) {
        Log.v("Loading Webview Failed", "Loading the webview Failed");
    }

    current_fact = 0;
1 голос
/ 11 декабря 2012

Просто добавьте <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> в AndroidManifest.xml.Это будет работать как по волшебству.Помог LogCat.

1 голос
/ 19 сентября 2011

возможно, объект NetworkInfo имеет значение null, и вы получаете исключение NullPointerException.Лучший способ узнать строку кода - использовать logcat и просмотреть трассировку стека.

Кстати, я использую аналогичный способ использования кэширования в WebViews, но на моем устройстве (Desire + CM7) это не так.не работает, так как кеш никогда не используется ..

С уважением, jayearn

0 голосов
/ 02 октября 2013

вам также нужно проверить networkInfo на ноль так что в основном ваш оператор if должен быть

if(cm.getActiveNetworkInfo() == null || !cm.getActiveNetworkInfo().isConnected()){
//load cache
}else{
//load default
}

Не забудьте добавить эти разрешения

<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"/>

Что касается AppCachePath, если вы строите для Android 2.2+, используйте вместо этого

engine.getSettings().setAppCachePath(getApplication().getCacheDir().toString());

Это гарантирует, что кэш будет удален при удалении приложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...