如何提高Android中方向更改的内容视图加载效果?

时间:2013-09-03 08:38:57

标签: android performance optimization android-webview android-orientation

我有一个教程应用程序,它加载一个教程页面列表[这是网页]。这些页面占据全屏,大约100dp用于菜单栏。虽然不能按原样共享源代码,但下面是Tutorial Activity的伪代码。

HashMap<Integer, customWebView > mapPage;
onCreate(){
    updateScreen();
}


updateScreen(){
    Instantiate CustomScrollView(Customized HorizontalScrollView);
    Instantiate scrollViewChildHolder (LinearLayout with horizontal orientation);
    Instantiate mapPage;
        for  index : total page size{
            Instantiate pageHolder(RelativeLayout);
            Instantiate customWebView (Custom WebView);//Takes orientation as one of argument
            Set  html page url;//customWebView has a method loadWebPage() which loads this url.
            Add customWebView  to pageHoler;
            mapPage.put(index, customWebView);
            Add pageHolder to  scrollViewChildHolder;
        }
    //pageNo which will be safely fetched from saved state. So it will be 1 on first start 
    //and on orientation change retains current reading page.
    onPageChange(pageNo);
}

//Custom callback on page swipe by user
@Override
onPageChange(int  pageNo){
    //Custom method which loads html page from url which was set in updateScreen() 
    mapPage.get(pageNo).loadWebPage();
    //unloadNeighbouring pages
    //Will  pick pageNo+2 & pageNo-2 pages and clears their content.
    unloadNeighbouringPagesTo(pageNo);
}

PS:

  1. 我必须在WebView上添加几个按钮,因此我们使用RelativeLayout作为页面包装器。

  2. 我无法选择适配器[PagerAdapter for ViewPager],因为它会导致webview在加载时突然闪现其内容,这是我们无法负担的。所以CustomHorizo​​ntalSrollView对我们来说是必须的。

  3. 我将在scrollview上添加大约150多页。

  4. 我有另外的页面分别为landsape&amp;肖像模式。因此,我需要重新定位方向变化。每个屏幕方向的视图大小也不同。

  5. 我没有覆盖onConfigurationChanged(..)。即在方向改变时,活动生命周期从新鲜开始。

  6. 问题:

    在方向更改时,加载页面内容需要2-3秒。此外,似乎应用程序很晚才检测到方向变化。

    请建议我如何提高快速加载方向更改的效果。

1 个答案:

答案 0 :(得分:0)

你可以做一件事创建一个布局文件,其中包含方向横向和纵向的设计。并覆盖OnConfigurationChange();

<强> mnifest.xml

<activity
            android:name="YourActivity"
            android:configChanges="keyboardHidden|orientation|screenSize" // this will not refresh your activity
             />

@Override
    public void onConfigurationChanged(Configuration newConfig) {

        super.onConfigurationChanged(newConfig);

        if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
            //visible landscape layout
            //hide portrait layout
        }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            //visible portrait layout
            //hide landscape layout
        }
    }