我在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();
}
显然,onSuccessListener
,onFailureListener
,timeoutHandler
,timeoutCallback
和isTaskActive
是实例变量。
正如您在run()
中定义的timeoutCallback
方法中所看到的,除了日志消息之外,还称为sumbitDownload()
。实际上,如果发生超时并且任务仍处于活动状态,则会启动新的下载。
现在,想象一下这种情况。
创建活动时,将启动下载任务。假设downloadTask
没有完成,并且onSuccessListener
和onFailureListener
都没有被调用,但是超时发生。因此,从run()
timeoutCallback
方法开始新的下载。
现在,前一个downloadTask
会发生什么?它被取消了吗?它被当前任务取代了吗?或者它是否继续活跃并可能触发其附加的听众?
如果后一个问题属实,那么如何从Task<T>
对象中删除侦听器?
然而,getResult()
方法是否完成(即完成)任务?