浏览器切换接入点无法立即生效的问题
来源:互联网 发布:淘宝联盟抽成 编辑:程序博客网 时间:2024/05/08 15:09
问题:
在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);
- 浏览器切换接入点无法立即生效的问题
- bat脚本切换jdk版本立即生效
- 关于js写入cookie立即生效的问题
- InstallShield修改环境变量后不能立即生效的问题
- switchHosts!修改hosts后不能立即生效的问题
- apn接入点切换
- apn接入点切换
- PHP修改后无法立即生效
- hosts立即生效的方法
- 谷歌Chrome浏览器下CSS设置字体大小小于12px无法生效的问题
- 输入法切换快捷键不生效的问题
- IE,FF浏览器下无法切换图片的问题
- 调整单元格宽度无法生效的问题
- 让DFS配置立即生效的方法
- LINUX让环境变量立即生效的方法
- 不重启让.bash_profile立即生效的方法
- LINUX让环境变量立即生效的方法
- LINUX让环境变量立即生效的方法
- 灰色按钮的破解
- Eclipse 自动提示设置
- Android培训班(38)
- Linux系统管理工具包系列汇总 Linux系统管理员必看
- 答案
- 浏览器切换接入点无法立即生效的问题
- javascript 的作用:
- Xen3.2安装
- 最近的java笔试问题
- JS判断checkbox是否选中
- VC编译错误:msvcrtd.lib(ti_inst.obj) 库冲突
- U盘安装Ubuntu方法
- Linux中各个硬件设备的文件名
- 如烟的过去