您的位置:首页 > 其它

浏览器切换接入点无法立即生效的问题

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐