Android Firebase - 从Task <t>中删除侦听器

时间:2017-11-14 15:49:31

标签: java android firebase firebase-storage

我在MyActivity类中定义了这个方法,允许我在内存中下载Firebase存储中的一些数据。

public void submitDownload() {
    Task<byte[]> downloadTask=FirebaseStorage.getInstance.
            getReference(DATA_PATH_TO_DOWNLOAD).getBytes(MAX_BYTES);

    isTaskActive=true;
    //remove eventually a previous callback from the handler
    timeoutHandler.removeCallbacks(timeoutCallback);

    downloadTask.addOnSuccessListener(MyActivity.this, onSuccessListener);
    downloadTask.addOnFailureListener(MyActivity.this, onFailureListener);
    timeoutHandler.postDelayed(timeoutCallback, 5000);
}

相反,这是onCreate()方法:

protected void onCreate() {
    super.onCreate();
    onSuccessListener=new OnSuccessListener<byte[]>() {
        public void onSuccess(byte[] bytes) {
            if(isTaskActive) {
                isTaskActive=false;
                Log.d("DOWNLOAD_TASK", "SUCCESS");
            }
        }
    };

    onFailureListener=new OnFailureListener() {
        public void onFailure(Exception e) {
            if(isTaskActive) {
                isTaskActive=false;
                Log.d("DOWNLOAD_TASK", "FAILURE");
            }
        }
    };

    timeoutHandler=new Handler();
    timeoutCallback=new Runnable() {
        public voi run() {
            if(isTaskActive) {
                isTaskActive=false;
                Log.d("DOWNLOAD_TASK", "TIMEOUT");
                submitDownload(); //retry download
            }
        }
    };

    submitDownload();
}

显然,onSuccessListeneronFailureListenertimeoutHandlertimeoutCallbackisTaskActive是实例变量。

正如您在run()中定义的timeoutCallback方法中所看到的,除了日志消息之外,还称为sumbitDownload()。实际上,如果发生超时并且任务仍处于活动状态,则会启动新的下载。

现在,想象一下这种情况。 创建活动时,将启动下载任务。假设downloadTask没有完成,并且onSuccessListeneronFailureListener都没有被调用,但是超时发生。因此,从run() timeoutCallback方法开始新的下载。 现在,前一个downloadTask会发生什么?它被取消了吗?它被当前任务取代了吗?或者它是否继续活跃并可能触发其附加的听众?

如果后一个问题属实,那么如何从Task<T>对象中删除侦听器? 然而,getResult()方法是否完成(即完成)任务?

0 个答案:

没有答案