如何在onSuccess完成后返回一个值?

时间:2018-01-11 16:50:56

标签: android firebase android-asynctask firebase-storage

我有一点麻烦,我在doinBackground任务中执行一个方法,所以我得到了一个崩溃因为我正在访问另一个类而没有先完成这个方法,所以我想添加一个返回或什么让方法知道何时需要启动其他活动。我已经搜索过了,我无法将一个布尔值,true或false返回到Firebase asynctask方法中。这是我用来下载文件并将其替换为内部内存的方法,但是当我这样做时,我需要在启动后启动的其他活动,我得到了崩溃,所以我需要先执行这个下载任务,然后如果某些事情是真的,请启动我的其他活动

这是我想放置一个布尔值或者告诉我下载完成的地方。

public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                Log.e("TamañoArchivo",""+taskSnapshot.getTotalByteCount());
                Log.e("NombreArchivo",""+xFile);

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

该方法不是asyncTask,是异步但是来自Firebase,这是方法:

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 :(得分:2)

已更新并带有以下注释(替换活动参考并改为介绍界面):

您可以使用AsyncTask明确地执行此类操作。请查看以下极简主义代码:

public class MyTask extends AsyncTask<Void, Void, Boolean> {

    private IMyCallbackContext context;

    public MyTask(IMyCallbackContext context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        // Here you are still on the MainThread
        // Do Stuff
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        // Here you are not on the MainThread
        // Do Stuff    
        return isSuccess;
    }

    @Override
    protected void onPostExecute(Boolean isSuccess) {
        // Here you are again on the MainThread
        if (isSuccess) {
            context.onTaskSuccessDoStuff();
        } else {
            context.onTaskFailureDoStuff();
        }
    }
}

public interface IMyCallbackContext {
    void onTaskSuccessDoStuff();
    void onTaskFailureDoStuff();
}

public class MyActivity extends Activity implements IMyCallbackContext {

    private void launchTask() {
        MyTask myTask = new MyTask(this);
        myTask.execute();
    }

    public void onTaskSuccessDoStuff() {
        // Do stuff after the task has completed
    }

    public void onTaskFailureDoStuff() {
        // Do stuff after the task has failed
    }
}

编辑:抱歉,我认为您有AsyncTask

答案 1 :(得分:1)

onSuccess()方法具有异步行为。这意味着,要使用从Firebase存储获取的数据,您需要等待它。所以要做到这一点,就没有必要使用AsyncTask,你可以简单地创建自己的自定义回调。

要实现这一目标,请从 post 中查看我的答案的最后一部分。正如Mohammed Atif在评论中提到的那样,永远不要直接使用Activity引用,因为它会导致内存泄漏。因此,我上面提到的方式是您实现这一目标的最简单,最安全的方式。