Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 基于0的数组长度。这是怎么回事?_Android_Delphi - Fatal编程技术网

Android 基于0的数组长度。这是怎么回事?

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

我在Delphi Android应用程序中编写了一个函数来确定是否启用了移动或Wifi(或两者)。我用来参考

我一定是弄错了,因为该功能没有检测到Wifi,即使在手机上启用了它

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
)。此时与阵列的连接在哪里?你甚至没有在你的循环中访问它。感谢所有参与这次讨论并得出正确答案的人。