浏览器切换接入点无法立即生效的问题
2011-02-27 20:18
239 查看
问题:
在S60系统中使用浏览器控件时,会遇到这样一个问题:当程序切换接入点时,浏览器控件不会立即使用新的接入点拨号。
问题分析:
引起上面问题的原因是重新设置接入点后,原来的链路没有断开。
问题解决:
1、
在切换接入点时,现将现有的浏览器控件对象销毁,重新创建新的对象,重新设置接入点,这样程序就会用新接入点拨号了。这种方式虽然能解决浏览器重新拨号的问题,但是会带来一个新的:在某些S60的版本中,程序中销毁然后重新创建浏览器对象会崩溃(这应该是symbian系统的一个bug),所以一般不采用这种方式。
2、
浏览器对象不需要销毁,但是切换接入点后,需要手动断开原来连接的链路。具体见下面代码:
CSpecialLoadObserver类成员变量如下:
TBool iIAPChange; // 接入点切换标识
TBool iConnectFlag; // 网路连接标识
TUint32 iSelectIAP;
// 接入点
RSocketServ iSocketServer;
RConnection iConnection;
// 初始化
void CSpecialLoadObserver::ConstructL()
{
// 创建连接对象
User::LeaveIfError(iSocketServer.Connect(KESockDefaultMessageSlots));
User::LeaveIfError(iConnection.Open(iSocketServer, KConnectionTypeDefault));
}
CSpecialLoadObserver::~CSpecialLoadObserver()
{
// 关闭连接
iConnection.Close();
iSocketServer.Close();
}
void CSpecialLoadObserver::SetIAPID(TUint32 iIAPID)
{
if (iIAPID != iSelectIAP)
{
iSelectIAP = iIAPID;
iIAPChange = ETrue;
}
}
// 连接网络
void CSpecialLoadObserver::NetworkConnectionNeededL(TInt* aConnectionPtr,TInt* aSockSvrHandle, TBool*
aNewConn,TApBearerType* aBearerType)
{
*aBearerType = EApBearerTypeAllBearers;
if (iIAPChange)
{
if (iConnectFlag)
{
// 先断开网络,此处是重新设置网络后,使用新接入点拨号的关键代码
iConnection.Stop();
iConnectFlag = EFalse;
}
// 建立网络连接
TCommDbConnPref prefs;
prefs.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
prefs.SetDirection(ECommDbConnectionDirectionOutgoing);
prefs.SetIapId(iSelectIAP); //preferred IAP
User::LeaveIfError(iConnection.Start(prefs));
*aNewConn = ETrue;
*aConnectionPtr = reinterpret_cast<TInt>(&iConnection);
*aSockSvrHandle = iSocketServer.Handle();
iConnectFlag = ETrue;
iIAPChange = EFalse;
}
else
{
*aNewConn = EFalse;
}
}
说明:CSpecialLoadObserver从MBrCtlSpecialLoadObserver继承,在CSpecialLoadObserver中实现MBrCtlSpecialLoadObserver中的函数NetworkConnectionNeededL();在创建浏览器控件对象时,同时需要创建CSpecialLoadObserver observer对象,然后将observer设置到浏览器控件中,代码如下:
CSpecialLoadObserver observer = CSpecialLoadObserver::NewL();
if (observer != NULL)
{
observer->SetIAPID(aIAPID);
}
// 创建浏览器控件
CBrCtlInterface* iBrCtlInterface = CreateBrowserControlL(this, iBrCtlRect, iBrCtlCapabilities, iCommandBase,
NULL, iLinkResolver, iSpecialLoadObserver, NULL, NULL);
在S60系统中使用浏览器控件时,会遇到这样一个问题:当程序切换接入点时,浏览器控件不会立即使用新的接入点拨号。
问题分析:
引起上面问题的原因是重新设置接入点后,原来的链路没有断开。
问题解决:
1、
在切换接入点时,现将现有的浏览器控件对象销毁,重新创建新的对象,重新设置接入点,这样程序就会用新接入点拨号了。这种方式虽然能解决浏览器重新拨号的问题,但是会带来一个新的:在某些S60的版本中,程序中销毁然后重新创建浏览器对象会崩溃(这应该是symbian系统的一个bug),所以一般不采用这种方式。
2、
浏览器对象不需要销毁,但是切换接入点后,需要手动断开原来连接的链路。具体见下面代码:
CSpecialLoadObserver类成员变量如下:
TBool iIAPChange; // 接入点切换标识
TBool iConnectFlag; // 网路连接标识
TUint32 iSelectIAP;
// 接入点
RSocketServ iSocketServer;
RConnection iConnection;
// 初始化
void CSpecialLoadObserver::ConstructL()
{
// 创建连接对象
User::LeaveIfError(iSocketServer.Connect(KESockDefaultMessageSlots));
User::LeaveIfError(iConnection.Open(iSocketServer, KConnectionTypeDefault));
}
CSpecialLoadObserver::~CSpecialLoadObserver()
{
// 关闭连接
iConnection.Close();
iSocketServer.Close();
}
void CSpecialLoadObserver::SetIAPID(TUint32 iIAPID)
{
if (iIAPID != iSelectIAP)
{
iSelectIAP = iIAPID;
iIAPChange = ETrue;
}
}
// 连接网络
void CSpecialLoadObserver::NetworkConnectionNeededL(TInt* aConnectionPtr,TInt* aSockSvrHandle, TBool*
aNewConn,TApBearerType* aBearerType)
{
*aBearerType = EApBearerTypeAllBearers;
if (iIAPChange)
{
if (iConnectFlag)
{
// 先断开网络,此处是重新设置网络后,使用新接入点拨号的关键代码
iConnection.Stop();
iConnectFlag = EFalse;
}
// 建立网络连接
TCommDbConnPref prefs;
prefs.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
prefs.SetDirection(ECommDbConnectionDirectionOutgoing);
prefs.SetIapId(iSelectIAP); //preferred IAP
User::LeaveIfError(iConnection.Start(prefs));
*aNewConn = ETrue;
*aConnectionPtr = reinterpret_cast<TInt>(&iConnection);
*aSockSvrHandle = iSocketServer.Handle();
iConnectFlag = ETrue;
iIAPChange = EFalse;
}
else
{
*aNewConn = EFalse;
}
}
说明:CSpecialLoadObserver从MBrCtlSpecialLoadObserver继承,在CSpecialLoadObserver中实现MBrCtlSpecialLoadObserver中的函数NetworkConnectionNeededL();在创建浏览器控件对象时,同时需要创建CSpecialLoadObserver observer对象,然后将observer设置到浏览器控件中,代码如下:
CSpecialLoadObserver observer = CSpecialLoadObserver::NewL();
if (observer != NULL)
{
observer->SetIAPID(aIAPID);
}
// 创建浏览器控件
CBrCtlInterface* iBrCtlInterface = CreateBrowserControlL(this, iBrCtlRect, iBrCtlCapabilities, iCommandBase,
NULL, iLinkResolver, iSpecialLoadObserver, NULL, NULL);
相关文章推荐
- 解决谷歌(Google Chrome)浏览器下CSS设置字体大小小于12px无法生效的问题
- 解决谷歌(Google Chrome)浏览器下CSS设置字体大小小于12px无法生效的问题
- 解决谷歌(Google Chrome)浏览器下CSS设置字体大小小于12px无法生效的问题
- 解决谷歌(Google Chrome)浏览器下CSS设置字体大小小于12px无法生效的问题
- 解决360浏览器和谷歌(Google Chrome)浏览器下CSS设置字体大小小于12px无法生效的问题
- IE,FF浏览器下无法切换图片的问题
- 解决360浏览器和谷歌(Google Chrome)浏览器下CSS设置字体大小小于12px无法生效的问题
- 解决Vue 浏览器后退无法触发beforeRouteLeave的问题
- 关于vs2008无法切换设计视图问题和office2007找不到office.zh-cn文件夹
- 解决PDFToFlex源程序的小BUG——页面控制的最后两页无法正常切换问题
- SWF文字查询及高亮显示——第三步:实现文字查询高亮显示及解决MovieClip帧切换时关键字无法高亮显示的问题
- MWPhotoBrowser图片无法左右滚动切换的问题
- 解決 IE10 浏览器无法使用 ASP.NET 表单验证登录的问题
- 为什么修改hosts不立即生效?--浏览器DNS缓存机制分析
- ajax导出Excel无法浏览器无法提示问题
- 修改电话中新通话记录无法立即显示联系人姓名问题
- 解決 IE10 浏览器无法使用 ASP.NET 表单验证登录的问题
- 浏览器回退按钮无法使用问题
- Delphi实现的登录窗口切换到桌面无法显示的问题
- android webView 无法播放视频,无法暂停,继续播放视频问题,无法根据浏览器居中显示内容问题