Android 基于0的数组长度。这是怎么回事?
我在Delphi Android应用程序中编写了一个函数来确定是否启用了移动或Wifi(或两者)。我用来参考 我一定是弄错了,因为该功能没有检测到Wifi,即使在手机上启用了它Android 基于0的数组长度。这是怎么回事?,android,delphi,Android,Delphi,我在Delphi Android应用程序中编写了一个函数来确定是否启用了移动或Wifi(或两者)。我用来参考 我一定是弄错了,因为该功能没有检测到Wifi,即使在手机上启用了它 function WhichNetwork: Integer; // 0 = none, 1 = wifi only, 2 = mobile only, 3 = both var obj: JObject; cm: JConnectivityManager; networks: TJavaObjectArra
function WhichNetwork: Integer; // 0 = none, 1 = wifi only, 2 = mobile only, 3 = both
var
obj: JObject;
cm: JConnectivityManager;
networks: TJavaObjectArray<JNetwork>;
i: Integer;
network: JNetworkInfo;
networktype: Integer;
networkname: String;
begin
Result := 0;
obj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
if Assigned(obj) then
begin
cm := TJConnectivityManager.Wrap((obj as ILocalObject).GetObjectID);
if Assigned(cm) then
begin
networks := cm.getAllNetworks;
if Assigned(networks) then
begin
for i := 0 to networks.Length - 1 do // this looks right!
begin
network := cm.getNetworkInfo(i);
networkname := JStringtoString(network.getTypeName); // for debug
networktype := network.gettype;
if networkType = TJConnectivityManager.JavaClass.TYPE_MOBILE then
begin
if network.isConnectedOrConnecting then
Result := Result + 2;
end
else if networkType = TJConnectivityManager.JavaClass.TYPE_WIFI then
begin
if network.isConnectedOrConnecting then
Result := Result + 1;
end;
end;
end;
end;
end;
end;
但是,Delphi通常不是这样工作的。有人能解释一下为什么TJavaObjectArray
的长度是零基的吗
这是一个学术性的问题,我真的很想理解这一点。按照惯例,德尔福使用零基索引。动态数组是基于零的。字符串在历史上是基于一的,但在移动平台上,默认字符串现在是基于零的。其他类型,如容器类、固定长度数组,由作者确定为零或基于一,但按照惯例,首选基于零
for i := 0 to networks.Length do
您说这个循环是正确的,但是按照所有已知的惯例,它看起来像是一个错误,因为循环覆盖了太多的一个元素。应该是:
for i := 0 to networks.Length-1 do
var
networks: TJavaObjectArray<JNetwork>;
networkInfo: JNetworkInfo;
....
networks := cm.getAllNetworks;
for i := 0 to networks.Length-1 do
begin
networkInfo := cm.getNetworkInfo(networks[i]);
....
end;
但是,您的循环不会引用循环体中的网络。这让人想知道,如果忽略网络的元素,为什么要使用网络。长度。如果您要获得阵列网络
,那么您肯定应该使用它。我希望,一旦你解决了这个难题,事情就会变得明朗起来
您似乎很难找到文档。也许您正在寻找Delphi文档。你不会找到的。这些是Android库,您需要查看Android文档。从这里开始:
您正在调用getNetworkInfo
。让我们看看它的文档。有两个重载,声明如下:
NetworkInfo getNetworkInfo(int networkType);
NetworkInfo getNetworkInfo(Network network);
第一个重载接受类型参数,但传递的是整数索引。这是一个错误。此外,不推荐使用第一个重载
看起来很像您打算使用第二个重载,因此代码应该是:
for i := 0 to networks.Length-1 do
var
networks: TJavaObjectArray<JNetwork>;
networkInfo: JNetworkInfo;
....
networks := cm.getAllNetworks;
for i := 0 to networks.Length-1 do
begin
networkInfo := cm.getNetworkInfo(networks[i]);
....
end;
var
网络:TJavaObjectArray;
networkInfo:JNetworkInfo;
....
网络:=cm.getAllNetworks;
对于i:=0到networks.Length-1 do
开始
networkInfo:=cm.getNetworkInfo(networks[i]);
....
终止
无论如何,这里给你的最大教训就是停止使用试错法。相反,请阅读文档。此基于0的阵列没有任何问题
您正在调用的重载(已弃用),该重载接受整数参数。此整数指定“您感兴趣的网络类型”,例如(0)、(1)和,而不是与返回的数组相关的索引位置
您需要调用获取as参数的重载,正如您在评论中所说的@nil
for i := 0 to networks.Length - 1 do begin
network := cm.getNetworkInfo(networks[i]);
...
end;
但我刚才告诉过你,长度为-1时,阵列中有一个元素(wifi元素)不会被for循环检查。这就是我问这个问题的原因。我不是在开玩笑。这个数组中确实有长度为零的元素!长度-零等于长度。但是你的循环重复了长度+1次。尽管如此,程序还是发现索引为0的元素已经定义,并且包含了关于移动网络的信息,而索引=数组长度的元素也已经定义,令人惊讶的是,它包含了关于wifi网络的信息。Teamviewer我会给你看的@RudyVelthuis嗯,我应该接受我自己的建议并正确阅读文档。这是罪过。您链接的问题表明getAllNetworkInfo
已被弃用,可能这是您问题的一部分?我没有使用getAllNetworkInfo!哦,对不起。我在阅读您的代码时混淆了getAllNetworks
和getNetworkInfo
。getNetworkInfo(int-networkType)
也不推荐使用。文档说明您应该改用getNetworkInfo(网络)
。所以我猜network:=cm.getNetworkInfo(networks[I])代码>。如果这样做,使用一个看起来正确的循环,您会得到预期的结果吗?不会,并且对数组没有影响。迭代由cm.getAllnetworks
返回的数组,然后继续使用循环变量调用不推荐使用的函数(cm.getNetworkInfo
)。此时与阵列的连接在哪里?你甚至没有在你的循环中访问它。感谢所有参与这次讨论并得出正确答案的人。