我正在编写一个自定义事件,希望得到一些帮助。我要谈论的大部分内容都是基于Android 应用上的自定义事件侦听器提供的帮助
所以这是我的问题。我正在编写一个应用程序,它需要从网上下载更新的图像,将图像存储在手机上,然后再显示这些图像。基本上,我会在启动画面期间下载任何需要的图像。然后,当图像被下载和存储时,启动屏幕会清除,并且任何必要的(新下载的)图像都会显示在屏幕上。这是问题所在:下载过程是通过异步任务完成的,因此无法在异步任务中完成将图像加载到屏幕上的部分。它必须在主 UI 线程上完成。我想为主线程创建一个事件和一个自定义事件侦听器来侦听,这基本上告诉主 UI 线程可以安全地开始从内存中加载下载的图像。
根据上面链接的讨论,到目前为止我想出了这个......下载监听器接口
public interface DataDownloadListener {
void onDownloadStarted();
void onDownloadFinished();
}
一个事件类...
public class DataDownloadEvent {
ArrayList<DataDownloadListener> listeners = new ArrayList<DataDownloadListener>();
public void setOnDownload(DataDownloadListener listener){
this.listeners.add(listener);
}
}
我的问题是我不明白在这些说明中将最后两个步骤放在哪里。我认为我必须将侦听器和事件放在实际启动下载的类中。但是哪里?这是我启动下载并将其保存到设备的函数:
public String download(String sourceLocation) {
String filename = "";
String path = "";
try {
File externalStorageDirectory = Environment
.getExternalStorageDirectory();
URL urlTmp = new URL(sourceLocation);
filename = urlTmp.getFile()
.substring(filename.lastIndexOf("/") + 1);
path = externalStorageDirectory + PATH;
// check if the path exists
File f = new File(path);
if (!f.exists()) {
f.mkdirs();
}
filename = path + filename;
f = new File(filename);
//only perform the download if the file doesn't already exist
if (!f.exists()) {
Bitmap bitmap = BitmapFactory.decodeStream(urlTmp.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(
filename);
if (bitmap != null) {
bitmap.compress(getFormat(filename), 50, fileOutputStream);
Log.d(TAG, "Saved image " + filename);
return filename;
}
}
else{
Log.d(TAG, "Image already exists: " + filename + " Not re-downloading file.");
}
} catch (MalformedURLException e) {
//bad url
} catch (IOException e) {
//save error
}
return null;
}
关于注册监听器的最后一步,我把它放在哪里?说明说在初始化期间把它放在某个地方。这是否意味着在我的主要活动的 onCreate 方法中?在主要活动的导入部分的课程之外?以前从未做过自定义活动,因此将不胜感激。