Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Firebase-从任务中删除侦听器<;T>;_Java_Android_Firebase_Firebase Storage - Fatal编程技术网

Java Android Firebase-从任务中删除侦听器<;T>;

Java Android Firebase-从任务中删除侦听器<;T>;,java,android,firebase,firebase-storage,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 ev

我在
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);
}
显然,
onSuccessListener
onFailureListener
timeoutHandler
timeoutCallback
isTaskActive
都是实例变量

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

现在,想象一下这个场景。 创建活动时,将启动下载任务。假设
downloadTask
没有完成,并且既没有调用
onSuccessListener
也没有调用
onFailureListener
,但发生超时。因此,从
timeoutCallback
run()
方法开始新的下载。 现在,前面的
下载任务发生了什么变化?取消了吗?它是否被当前任务替换?或者它是否继续处于活动状态并可能触发其连接的侦听器

如果后一个问题是真的,那么如何从
任务
对象中删除侦听器? 但是,
getResult()
方法是否完成(即完成)任务

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();
}