我正在撰写自定义活动,并希望得到一些帮助。我要讨论的大部分内容都是基于Custom event listener on Android app
提供的帮助所以这是我的问题。我正在编写一个应用程序,需要从网上下载更新的图像,将图像存储在手机上,然后显示这些图像。基本上,我在启动画面中下载任何所需的图像。然后,当下载并存储图像时,闪屏将清除,并且在屏幕上显示任何必要的(新下载的)图像。问题出在这里:下载过程是通过asynctask完成的,因此无法在asynctask中完成将图像加载到屏幕上的部分。它必须在主UI线程上完成。我想为主线程创建一个事件和一个自定义事件监听器来监听,这基本上告诉主UI线程,从内存开始加载下载的图像是安全的。
根据上面链接的讨论,到目前为止,我想出了这个...下载听众interace
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方法?在主要活动的导入部分的课外?以前从未做过自定义活动,所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
根据上面链接的讨论,到目前为止,我想出了这个...下载听众interace
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); } }
好的...
现在,在下载过程中,在下载开始时,循环侦听器 ArrayList上的所有元素,并调用 onDownloadStarted 事件,以通知所有侦听器下载刚刚开始(在这种情况下,我认为你需要打开闪屏)。
始终在下载过程中,在下载过程中,循环侦听器 ArrayList上的所有元素并调用 onDownloadFinished 事件,以通知所有侦听器下载完成(现在关闭启动画面)。
如何在下载完成后循环播放
foreach(DataDownloadListener downloadListener: listeners){
downloadListener.onDownloadFinished();
}
如何在下载开始时循环播放
foreach(DataDownloadListener downloadListener: listeners){
downloadListener.onDownloadStarted();
}
答案 1 :(得分:0)
如果可能的话,不要让它变为静态...在您用来下载文件的类中,只需添加您在 DataDownloadEvent 类中添加的内容(侦听器arrayList)和添加和删除的设施方法)。你没有立即需要以这种方式使用类(我的意思是静态成员)。
实施例
public class DownloadFileClassExample{
private ArrayList<DataDownloadListener> listeners = new ArrayList<DataDownloadListener>();
public DownloadFileClassExample(){
}
public void addDownloadListener(DataDownloadListener listener){
listeners.add(listener);
}
public void removeDownloadListener(DataDownloadListener listener){
listeners.remove(listener);
}
//this is your download procedure
public void downloadFile(){...}
}
然后以这种方式访问你的课程
DownloadFileClassExample example = new DownloadFileClassExample();
example.addDownloadListener(this); // if your class is implementing the **DataDownloadListener**
或使用
example.addDownloadListener( new DataDownloadListener{...})