crossapp webview控件的一个坑

CAWebView 控件 也就是浏览器控件,可以在app里面嵌入网页。

使用方法可以查看 CAWebView.h 里面的方法。基本上包含了常用浏览器的操作,比如前进、后退、刷新、javascript执行等等。当然还有CAWebViewDelegate

提供给的四个很有用函数。

今天说的坑就是 webview控件显示在主界面的时候,回到系统桌面视图,再次打开 app,就会出现界面卡死现象。

当然这个是发生在安卓系统下面的,IOS不知道。

问题分析:

不加入webview控件,app不会出现卡死,加了之后就会出现。肯定是webview的问题了。

尝试办法:

1.程序进入后台之后,将 webview 从它的主视图移除,程序从后台恢复,将webview添加的 它的主视图里面。

涉及相关函数

AppDelegate.cpp文件下面的applicationDidEnterBackground() 和applicationWillEnterForeground(),

如果不知道 程序启动流程的,建议看一下 Cocos2d-x高级开发教程.pdf,因为crossapp就是从cocos2dx移植过来的(当然肯定改了很多东西,不然一个游戏界面耗电量那是相当的惊人)。

建议使用 CClog 来调试 一些相关信息,能够帮助你更快的定位问题的所在。

下面是我在确认程序启动过程中 添加的一个调试信息。

// This function will be called when the app is inactive. When comes a phone call,it's be invoked toovoid AppDelegate::applicationDidEnterBackground(){CAApplication::getApplication()->stopAnimation();//addMainPageViewController *pmain = MainPageViewController::getInstance();if (pmain){pmain->applicationDidEnterBackground();}CCLog("—-applicationDidEnterBackground");// if you use SimpleAudioEngine, it must be pause// SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();}当敲了一通代码之后,满以为事情会按照期望的方向进行,但是结果却是,,再次打开app,直接自动退出了 。

再次分析:既然将webview移除视图不行,那么就之后删除掉,等下次进入的之后新建一个。说做就做,这次和期望的一样。

如果想恢复最后一次的网页,可以查看CAWebViewDelegate类

事情按照预期的方向进行着,但是查看日志会发现,applicationWillEnterForeground和applicationDidFinishLaunching 这两个函数调用 没有规则。大部分情况下都在调用applicationDidFinishLaunching这个函数,可能是硬件问题。

少部分时候回调用applicationWillEnterForeground这个函数,但是这个函数只要一调用,有很大几率回出现黑屏情况。

继续分析,还是webview问题。webview控件在视图之前启动了,并且加入了试图控制器里面。但是程序开始的时候创建webview是没问题的。分析到这里,思路就出来了,

在applicationWillEnterForeground函数里面,启动一个定时器。定时2秒之后(当app里面的控件都启动布局之后),再创建一个webview控件,添加到试图控制器里面。

代码如下:

// this function will be called when the app is active againvoid AppDelegate::applicationWillEnterForeground(){CAApplication::getApplication()->startAnimation();//addMainPageViewController *pmain = MainPageViewController::getInstance();if ( pmain){pmain->applicationWillEnterForeground();}CCLog("—-applicationWillEnterForeground");// if you use SimpleAudioEngine, it must resume here// SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();}void MainPageViewController::applicationWillEnterForeground(){//重新生成WebControl//initWebControl();CAScheduler::getScheduler()->schedule(schedule_selector(MainPageViewController::web_callback) , this , 2.2 ,false , 0 );}void MainPageViewController::web_callback(float index){CCLog("—-web_callback");initWebControl();}void MainPageViewController::initWebControl(){deleteWebControl();CADipRect re = getView()->getBounds();re.size.height = re.size.height*0.9;pweb = CAWebView::createWithFrame( re );if ( !pweb ){CCLog("—–create webview error;");exit(0);}else{this->getView()->addSubview(pweb);pweb->loadURL("https://www.baidu.com/");CCLog("—–create webview successed;");}}

当代码敲到这里的时候,调试OK

版权声明:本文为博主原创文章,未经博主允许不得转载。

这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!

crossapp webview控件的一个坑

相关文章:

你感兴趣的文章:

标签云: