【问题标题】:Load webview data from cache set in ViewPager从 ViewPager 中的缓存集加载 webview 数据
【发布时间】:2017-11-22 11:47:40
【问题描述】:

我正在开发一个需要将 webView 设置为 ViewPager 项目的应用程序。我每次都使用创建片段的newInstace() 作为我拥有的URL 的arrayList 的大小来做到这一点。 但是,我有超过 20 个 URL 需要加载,所以如果我设置 mPager.setOffscreenPageLimit(myArray.size()) 会占用太多的负载。如果我使用mPager.setOffscreenPageLimit(1),那么它每次都会重新加载。那么,有没有什么办法可以防止每次都重新加载网页呢?

public static class PlaceholderFragment extends BaseFragment {

    Activity activity;
    private int media_position = 0;
    private String media_url = "";

    private static final String KEY_CONTENT = "CategoriesFragment:Content";
    private String mContent = "???";

    public static PlaceholderFragment newInstance(int media_position, String media_url) {

        PlaceholderFragment fragment = new PlaceholderFragment();
        fragment.media_position = media_position;
        fragment.media_url = media_url;
        return fragment;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(KEY_CONTENT, mContent);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) {
            mContent = savedInstanceState.getString(KEY_CONTENT);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        web1 = inflater.inflate(R.layout.fragment_main, container, false);
        activity = getActivity();

        mWebView1 = (WebView) web1.findViewById(R.id.webview);

        mWebView1.setWebViewClient(new WebViewClient());
        mWebView1.getSettings().setJavaScriptEnabled(true);
        mWebView1.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        mWebView1.getSettings().setSupportMultipleWindows(true);
        mWebView1.getSettings().setSupportZoom(true);
        mWebView1.getSettings().setBuiltInZoomControls(false);
        mWebView1.getSettings().setAllowFileAccess(true);
        mWebView1.getSettings().setAppCacheEnabled(true);
        mWebView1.getSettings().setDomStorageEnabled(true);
        mWebView1.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

        mWebView1.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);

                boolean isLoaded = false;

                if (Utils.LoadedUrlList.containsKey(Utils.currentUrl)) {
                    Log.e("Matched key", "media_position --> " + media_position + " currentUrl --> " + Utils.currentUrl);
                    isLoaded = true;
                } else {
                    Log.e("Not Matched", "media_position --> " + media_position + " media_url --> " + media_url);
                    isLoaded = false;
                }

                Log.e("onPageStarted", "onPageStarted");

                if (!isLoaded)
                    if (media_position == 0)
                        ShowProgressDialog(activity, activity.getString(R.string.loading));
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);

                Log.e("onPageFinished", "onPageFinished");
                Log.e("onPageFinished", "--> " + url);

                hideProgressDialog();
                CookieSyncManager.getInstance().sync();

                for (int i = 0; i < Utils.SocialURLList.size(); i++) {

                    if (url.equals(Utils.SocialURLList.get(i))) {
                        Utils.LoadedUrlList.put(Utils.SocialURLList.get(0), true);
                    }
                }
            }
        });

        mWebView1.loadUrl(media_url);
        return web1;
    }

}

【问题讨论】:

    标签: android webview android-viewpager


    【解决方案1】:
    public void onPageFinished(WebView view, String url) {
        CookieSyncManager.getInstance().sync();
    }
    

    一旦加载了 WebView 并调用了 onPageFinished,您就可以将数据保存到 cookie 中。 还要加webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

    【讨论】:

    • 如何从 cookie 再次加载网页?
    • 调用webview.load(url)时会自动调用。
    • 同时添加 webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    • 我需要把 webview.load(url), 在 onPageSelected() 中?
    • 没有。你不需要。下次调用 webview 时,会检查缓存是否可用
    【解决方案2】:

    我不得不做同样的事情。我发现将数据保存在onSaveInstanceState 并不能很好地扩展(我没有尝试@Ameer 建议的cookie 方法)。

    相反,在您下载 HTML 后,您可以将 HTML 保存到这样的文件中:

        try {
            OutputStreamWriter outputStreamWriter =
                    new OutputStreamWriter(context.openFileOutput(email_id + ".txt", Context.MODE_PRIVATE));
            outputStreamWriter.write(email_body);
            outputStreamWriter.close();
        } catch (IOException e) {
            Log.e("Exception", "File write failed: " + e.toString());
        }
    

    并将email_id 与当前时间保存在SharedPreferences 中。

    然后当片段再次加载时,检查email_id 是否存在于SharedPreferences 中。如果没有,或者使用它节省的时间超过您所需的缓存长度,则(重新)从网络加载页面。否则,像这样调用缓存的email_body

    public String getCachedHTML(String email_id) {
        String ret = "";
        try {
            InputStream inputStream = context.openFileInput(email_id + ".txt");
    
            ret = readFile(ret, inputStream);
        } catch (FileNotFoundException e) {
            Log.e("login activity", "Email cache not found: " + e.toString());
        } catch (IOException e) {
            Log.e("login activity", "Can not read email cache: " + e.toString());
        }
        return ret;
    }`
    

    您可以像这样在 webview 上设置 HTML:

    webView.loadData(email_body, "text/html; charset=UTF-8", null);
    

    【讨论】:

    • 我认为,它不适用于我的情况。因为我需要加载gmail、fb webPage
    猜你喜欢
    • 2013-06-20
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多