Harjan
Harjan

Reputation: 533

Loading a webview from cache while ofline

My app consists of a mainactivity, which leads to a second activity with the option of 1 of 3 buttons that all lead to different webviews. The webviews just load simple HTML pages with a photo in it and some text.

I want my users to load the page 1 time and then cache the page. i used web.setCacheMode(LOAD_CACHE_ELSE_NETWORK) for this. all fine and dandy, but here's the catch. I use a Refresh button in the action bar. wich just calls web.reload() or web.loadUrl("MyURL") But, when i use the above cache mode the refresh button doesnt work, it just loads the cached page. So when i update my HTML page with a new photo or text it doesnt get loaded in. But when i use web.setcacheMode(LOAD_DEFAULT) it doesnt get cached but the refresh button works. i determined i NEED to have a internet connecting for the cache to work.... wich is quite weird...

below is the code i use in the webview.

public class AGF_R1 extends ActionBarActivity {


    WebView web;

    private int getScale(){
        Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int width = display.getWidth();
        Double val = new Double(width)/new Double(1200);
        val = val * 100d;
        return val.intValue();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater mif = getMenuInflater();
        mif.inflate(R.menu.menu_agf__r1, menu);
        return super.onCreateOptionsMenu(menu);

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //regelt de onClick
        switch (item.getItemId()) {
            case R.id.herlaad:
                web.reload();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(com.KnapperDev.knapper.jrw.R.layout.activity_agf__r1);

        web = (WebView) findViewById(com.KnapperDev.knapper.jrw.R.id.AGF_WebView1);
        web.setInitialScale(getScale());
        web.getSettings().setJavaScriptEnabled(true);
        web.getSettings().setBuiltInZoomControls(true);
        web.getSettings().setLoadsImagesAutomatically(true);
        web.loadUrl("http://77.161.45.179/AGF/AGF_R1.html");
        web.getSettings().setAppCacheEnabled(true);
        web.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        web.setWebViewClient(new AGF_WebClient());

        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.MONDAY);

        int week = cal.get(Calendar.WEEK_OF_YEAR);
        int w1 = week;
        int w2 = week + 1;
        int w3 = week + 2;
        String rst = "Rooster week: ";

        getSupportActionBar().setTitle(rst + w1);

    }

    public class AGF_WebClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()){
            web.goBack();
            return  true;
        }
        return super.onKeyDown(keyCode, event);
    }

}

Upvotes: 2

Views: 110

Answers (1)

JamesSugrue
JamesSugrue

Reputation: 15011

Instead of refreshing the webpage, you could try flushing the cache with the refresh button?

Bit of a brute force solution admittedly...

Reference: http://developer.android.com/reference/android/webkit/WebView.html#clearCache%28boolean%29

Upvotes: 2

Related Questions