猿问

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

我基本上是在尝试创建一个解压缩功能。我在下面的块中使用参数调用了该函数:


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。


请帮忙解决这个问题


有只小跳蛙
浏览 213回答 2
2回答

眼眸繁星

可以剪下以下几行:UnzipUtility unzipUtility = new UnzipUtility();try {    unzipUtility.unzip(localFilePath, parentPath);} catch (IOException e) {    e.printStackTrace();}在类SFTPActivity 中粘贴以下行的正下方:Downloader(fileName); 的方法doInBackground。实际上,该方法doInBackground()在与该方法运行的线程不同的线程中onCreate运行。您尝试在方法Downloader(fileName)完成其工作之前使用变量。这就是您在变量中看到空值的原因,例如:localFilePath和parentPath

慕神8447489

您的代码不起作用的原因是因为在运行此行时:unzipUtility.unzip(localFilePath, parentPath);变量localFilePath和parentPath尚未设置。您可能会争辩说,它们是在方法中设置的,该方法Downloader在该unzip行之前调用。不幸的是,事实并非如此。在这种情况下,代码执行不是线性的,因为您使用的是AsyncTask. 异步任务中的内容与其后面的行同时运行。您的下载调用不会在调用之前完成unzipUtility.unzip,因为与创建新UnzipUtility对象相比,下载需要大量时间。这就是为什么localFilePath并且parentPath为空。解决此问题的一种方法是将解压缩逻辑也移动到异步任务中:new AsyncTask<Void, Void, List<String>>() {&nbsp; &nbsp; @Override&nbsp; &nbsp; protected List<String> doInBackground(Void... params) {&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Downloader(fileName);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UnzipUtility unzipUtility = new UnzipUtility();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unzipUtility.unzip(localFilePath, parentPath);&nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; }}.execute();另一种方式是重写onPostExecute的AsyncTask还有:new AsyncTask<Void, Void, List<String>>() {&nbsp; &nbsp; &nbsp;// doInBackground goes here...&nbsp; &nbsp; &nbsp;@Override&nbsp; &nbsp; &nbsp;protected void onPostExecute(Long result) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UnzipUtility unzipUtility = new UnzipUtility();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unzipUtility.unzip(localFilePath, parentPath);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp;}}
随时随地看视频慕课网APP

相关分类

Java
我要回答