为了账号安全,请及时绑定邮箱和手机立即绑定

从被调用方传递的参数,但在方法定义中为 null

从被调用方传递的参数,但在方法定义中为 null

有只小跳蛙 2021-09-15 14:25:30
我基本上是在尝试创建一个解压缩功能。我在下面的块中使用参数调用了该函数:UnzipUtility unzipUtility = new UnzipUtility();    try {        unzipUtility.unzip(localFilePath, parentPath);    } catch (IOException e) {        e.printStackTrace();    }该方法定义在一个UnzipUtility类中,代码如下:    public void unzip(String zipFilePath, String destDirectory) throws IOException {    File destDir = new File(destDirectory);    if (!destDir.exists()) {        destDir.mkdir();    }    ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));    ZipEntry entry = zipIn.getNextEntry();    // iterates over entries in the zip file    while (entry != null) {        String filePath = destDirectory + File.separator + entry.getName();        if (!entry.isDirectory()) {            // if the entry is a file, extracts it            extractFile(zipIn, filePath);        } else {            // if the entry is a directory, make the directory            File dir = new File(filePath);            dir.mkdir();        }        zipIn.closeEntry();        entry = zipIn.getNextEntry();    }    zipIn.close();}但是在运行时,虽然参数在主类中正确传递,但值在 unzip 方法中显示为 null。请帮忙解决这个问题
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

可以剪下以下几行:


UnzipUtility unzipUtility = new UnzipUtility();

try {

    unzipUtility.unzip(localFilePath, parentPath);

} catch (IOException e) {

    e.printStackTrace();

}

在类SFTPActivity 中粘贴以下行的正下方:


Downloader(fileName); 

的方法doInBackground。实际上,该方法doInBackground()在与该方法运行的线程不同的线程中onCreate运行。您尝试在方法Downloader(fileName)完成其工作之前使用变量。这就是您在变量中看到空值的原因,例如:localFilePath和parentPath


查看完整回答
反对 回复 2021-09-15
?
慕神8447489

TA贡献1780条经验 获得超1个赞

您的代码不起作用的原因是因为在运行此行时:


unzipUtility.unzip(localFilePath, parentPath);

变量localFilePath和parentPath尚未设置。


您可能会争辩说,它们是在方法中设置的,该方法Downloader在该unzip行之前调用。不幸的是,事实并非如此。在这种情况下,代码执行不是线性的,因为您使用的是AsyncTask. 异步任务中的内容与其后面的行同时运行。


您的下载调用不会在调用之前完成unzipUtility.unzip,因为与创建新UnzipUtility对象相比,下载需要大量时间。


这就是为什么localFilePath并且parentPath为空。


解决此问题的一种方法是将解压缩逻辑也移动到异步任务中:


new AsyncTask<Void, Void, List<String>>() {

    @Override

    protected List<String> doInBackground(Void... params) {

        try {

            Downloader(fileName);


            UnzipUtility unzipUtility = new UnzipUtility();

            unzipUtility.unzip(localFilePath, parentPath);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return null;

    }


}.execute();

另一种方式是重写onPostExecute的AsyncTask还有:


new AsyncTask<Void, Void, List<String>>() {

     // doInBackground goes here...


     @Override

     protected void onPostExecute(Long result) {

         try {

            UnzipUtility unzipUtility = new UnzipUtility();

            unzipUtility.unzip(localFilePath, parentPath);

         } catch (Exception e) {

            e.printStackTrace();

         }

     }

}


查看完整回答
反对 回复 2021-09-15
  • 2 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信