【问题标题】:Looping a method many times causes error多次循环方法会导致错误
【发布时间】:2017-07-23 10:01:05
【问题描述】:

我正在循环一个返回 DocumentFile 100 次甚至更多次的方法。很多时候,该方法在已经循环了大约 35 次时返回 null。

这是正在循环的方法。

 public  static DocumentFile documentfile(final File file ) {

    for (UriPermission permissionUri :con.getContentResolver().getPersistedUriPermissions()) {

        DocumentFile rootDocFile = DocumentFile.fromTreeUri(con, permissionUri.getUri());

        String[] parts = (file.getPath()).split("\\/");

        for (int i = 3; i < parts.length; i++) {

            if (rootDocFile != null)
            {
                rootDocFile = rootDocFile.findFile(parts[i]);
            }

            else {

                rootDocFile = DocumentFile.fromTreeUri(con,permissionUri.getUri() );
                rootDocFile = rootDocFile.findFile(parts[i]);
            }

        }


        return rootDocFile;

    }
    return null;
}

这就是我循环方法的方式

for(int i=0;i<size;i++)
{
    documentfile(file).createFile(mime, name)
}

以上所有代码都在异步任务中执行。

任何帮助都会非常感激。

编辑:尝试使用更新的代码,但仍然收到相同的错误。

更新代码

public static DocumentFile DocumentFile(final File file)
{

    DocumentFile rootDocFile = DocumentFile.fromTreeUri(con, permission().getUri());

    String[] parts = (file.getPath()).split("\\/");

    for (int i = 3; i < parts.length; i++)
    {

        rootDocFile = rootDocFile.findFile(parts[i]);

    }
    return rootDocFile;
}

public static UriPermission permission()
{
    for (UriPermission permissionUri : con.getContentResolver().getPersistedUriPermissions())
    {
        final File uri_path = new File(FileUtil.getFullPathFromTreeUri(permissionUri.getUri(), con));

        if (uri_path.getName().toLowerCase().equals(new File("SD_CARD_PATH").getName().toLowerCase()))
        {
            return permissionUri;

        }

    }

    return null;
}

这就是我检查授予的权限是否适用于 SD 卡的方式

public static boolean wrong_directory_selected(Uri uri, Context con)
    {

        final File uri_path=new File(FileUtil.getFullPathFromTreeUri(uri,con));
        if(uri_path.getName().toLowerCase().equals(new File("SD CARD PATH").getName().toLowerCase()))
        {

            return false;
        }
        return  true;
    }

【问题讨论】:

  • 请正确缩进您的代码。就目前而言,阅读它并不容易。谢谢。
  • 当“con.getContentResolver().getPersistedUriPermissions()”没有任何“UriPermission”时,方法“documentfile”返回null。您必须关注“con.getContentResolver().getPersistedUriPermissions()”并验证何时没有 UriPermission。
  • @j.e.gr 如果我将方法循环例如 100 次,那么代码可以正常工作 35 到 40 次。表示已经给了权限,我也在检查是否给了权限。
  • 当您清楚地退出列表中的第一个值时,为什么要在 for 循环中调用 getPersistedUriPermissions()?在我看来,该调用返回的列表有时是空的。您可能在其他地方打电话给releasePersistableUriPermission() 吗?从代码的结构方式来看,fromTreeUri() 也有可能返回 null。如果我们对您想要实现的目标有更多了解,我们可能会提供更好的实现方式。您还可以向 logcat 添加消息或对其进行调试,以查看该方法返回 null 的原因。
  • @Dave 我确定该列表不为空,因为我正在使用共享首选项检查用户是否已授予权限。不,我不会在任何地方打电话给releasePersistableUriPermission()。我正在尝试将一些文件复制到 SD 卡。所以首先我在 SD 卡中创建一个文件,然后传输。 fromTreeUri() 是否有任何理由返回 null。我不太喜欢编程。任何帮助都会非常感激。

标签: java android loops nullpointerexception null


【解决方案1】:

在您的代码的else 部分中,在第一行,您正在从sd-card 的URI 创建一个新的DocumentFile,然后在第二行,您尝试在sd-card 的根目录,它什么都不提供。

在您从用户提供的 URI 中获取 null 后,我无法猜测 else 部分背后的逻辑。

当您从这种方法中得到 null 时,这意味着用户选择了错误的目录作为sd-card。 所以你要做的第一件事就是要求用户提供sd-card的正确路径。

public static DocumentFile documentfile(final File file ) {   
  for (UriPermission permissionUri : con.getContentResolver().getPersistedUriPermissions()) {   
        DocumentFile rootDocFile = DocumentFile.fromTreeUri(con, permissionUri.getUri());    
        String[] parts = (file.getPath()).split("/");    
          for (int i = 3; i < parts.length; i++) {        
            if (rootDocFile != null) {
                rootDocFile = rootDocFile.findFile(parts[i]);
            }
            if (rootDocFile != null) {
                break;
            }
            //else {
            //    rootDocFile = DocumentFile.fromTreeUri(con, permissionUri.getUri());
            //    rootDocFile = rootDocFile.findFile(parts[i]);
            //}        
          }
      }
      return rootDocFile;
}

如果rootDocFile 为空,则询问用户正确的路径

看我之前的解释here

【讨论】:

  • 非常感谢您的回答,如果它解决了我的问题,我会尝试并接受它作为正确答案。推出新更新并检查其是否正常运行可能需要几天时间。
  • 我尝试了您的建议,但仍然收到相同的错误。我也更新了代码。你能帮帮我吗?
  • 好的,我们如何使用 DocumentFile 创建文件是另一回事,需要您在 stacoverflow 上提出另一个问题,并提供详细说明和您正在使用的确切代码,并在此处为我提供链接.
  • 为了这个问题,只需通过此处提供的循环方法确保您拥有所需的文件作为您问题的答案。
  • 如果您在创建文件时遇到错误并不意味着您从循环中获得的DocumentFile 为空。
猜你喜欢
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多