我的方法总是返回false,但它有效

时间:2018-01-11 13:36:48

标签: android

我有这个方法从firebase存储下载一些东西,就是文件被下载但是fSucess总是假的。我正在尝试移动日志以获取它放置错误的位置,但我不知道为什么该方法总是返回false但它确实在内部。任何的想法?我想在下载两个文件时返回true

public boolean DescargarArchivosPais(String locale){

        File rootPath = new File(context.getCacheDir(),"MY_FILES");
        if(!rootPath.exists()) {
            rootPath.mkdirs();//si no existe el directorio lo creamos
        }

        StorageReference mStorageRef2 = FirebaseStorage.getInstance().getReference().child("Files/y/" + "y_" + locale + "." + "txt");
        StorageReference mStorageRef1 = FirebaseStorage.getInstance().getReference().child("Files/x/" + "x_" + locale + "." + "txt");
        Log.e("REFERENCIAx",""+ mStorageRef1);
        Log.e("REFERENCIAy",""+ mStorageRef2);

        final File xFile = new File(rootPath, "x.txt");
        final File yFile = new File(rootPath, "y.txt");

        mStorageRef1.getFile(xFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {

                Log.e("TamañoArchivo",""+taskSnapshot.getTotalByteCount());
                Log.e("NombreArchivo",""+xFile);

                try {

                    FileOutputStream fos = context.openFileOutput("x.txt", Context.MODE_PRIVATE);
                    fos.write(getStringFromFile(xFile.getAbsolutePath()).getBytes());
                    Log.e("LOG",""+getStringFromFile(xFile.getAbsolutePath()));
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }


            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {

            }
        });

        mStorageRef2.getFile(yFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {

                Log.e("TamañoArchivo",""+taskSnapshot.getTotalByteCount());
                Log.e("NombreArchivo",""+yFile);

                try {
                    FileOutputStream fos = context.openFileOutput("y.txt", Context.MODE_PRIVATE);
                    fos.write(getStringFromFile(gruposFile.getAbsolutePath()).getBytes());
                    Log.e("LOG2",""+getStringFromFile(gruposFile.getAbsolutePath()));
                    fos.close();
                    fSuccess = true;
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.e("printStackTrace",""+e.toString());
                    fSuccess = false;
                }
                fSuccess = true;
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                fSuccess=false;
                Log.e("printStackTrace",""+e.toString());
            }

        });
        return fSuccess;
    }

2 个答案:

答案 0 :(得分:1)

您正在从方法返回,但Asynchronous调用仍在进行中。这不是回调方法的工作原理。

你应该Interface给回调实体回电。

阅读how-to-define-callback

答案 1 :(得分:0)

好像你没有在mStorageRef1成功回调中更新ISuccess的状态。在那里也写一个日志。 当然,您无法从此方法返回状态,因为它不会等待结果(异步调用),并且ISuccess将保持不变。 可能更好的方法是在与每个资源关联的类级别维护Status标志(可能的值如STARTED,COM​​PLETED,IN PROGRESS,ERROR),并根据addOnSuccessListener回调更新状态标志。

希望你能得到我在这里想说的话。

快乐的编码!!