【问题标题】:ViewPager slide with webview带有 webview 的 ViewPager 幻灯片
【发布时间】:2023-03-28 11:13:01
【问题描述】:

我正在构建某种传记的 android 应用程序。我必须加载aprox。 9个网址到不同的网页视图。我有一个 Viewpager,并为我拥有的每个 url 添加一个 webview。第一个 webview 加载本地 html 文件,其他 webview 加载 facebook、instagram、youtube 和其他网页。
我的问题是整个加载过程需要很长时间。当我添加了所有链接时,即使是第一页也加载缓慢。有时页面不会呈现,直到我在 webview 幻灯片之间滑动。这是我的实现:

public class MyViewPagerAdapter extends PagerAdapter {
    private LayoutInflater layoutInflater;

    public MyViewPagerAdapter() {
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View view = layoutInflater.inflate(layouts[position], container, false);

        pageMap.put(position, view);

        final WebView webView = (WebView)view.findViewById(R.id.webView);
        final RelativeLayout loadingLayout = (RelativeLayout)view.findViewById(R.id.loadinLayout);
        final TextView  tvProgress = (TextView)view.findViewById(R.id.tvProgress);
        final SwipeRefreshLayout mySwipeRefreshLayout = (SwipeRefreshLayout)view.findViewById(R.id.swipeContainer);

        webView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
                tvProgress.setText(progress+" %");
            }
        });
        webView.setWebViewClient(new MyWebViewClient(loadingLayout));
        webView.getSettings().setBuiltInZoomControls(false);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setDomStorageEnabled(true);
        webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // chromium, enable hardware acceleration
            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        }
        else {
            webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }

        webView.loadUrl(urls[position].split("\\|",-1)[0]);

        mySwipeRefreshLayout.setOnRefreshListener(
                new SwipeRefreshLayout.OnRefreshListener() {
                    @Override
                    public void onRefresh() {
                        webView.reload();
                        mySwipeRefreshLayout.setRefreshing(false);
                    }
                }
        );

        container.addView(view);
        return view;
    }

    @Override
    public int getCount() {
        return layouts.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object obj) {
        return view == obj;
    }


    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        View view = (View) object;
        container.removeView(view);
    }
}

如何加快加载过程,或优先考虑 webviews 加载顺序?

【问题讨论】:

    标签: android webview android-viewpager fragment


    【解决方案1】:

    你可以使用setOffscreenPageLimit

    mViewPager.setOffscreenPageLimit(no_of_items);
    

    其中no_of_items 是整数,用于设置要在当前浏览器项目的任一侧预加载的项目数。假设您将此值设置为 2,则将预取当前 viewpager 项目两侧的 2 个项目。

    【讨论】:

    • 我用了它,为了最大碎片,但是负载仍然很可怕
    • 尝试设置较小的值,以获得更好的结果
    • 我还在 onPageChangeListener 中添加了这个“if (position >= currentSlidePosition) { currentSlidePosition=position; viewPager.setOffscreenPageLimit(position); }”
    • 尝试添加viewPager.setOffscreenPageLimit(2) 看看效果如何
    • 现在页面保持空白,直到我开始在它们之间滑动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多