0

我正在编写一个自定义事件,希望得到一些帮助。我要谈论的大部分内容都是基于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 方法中?在主要活动的导入部分的课程之外?以前从未做过自定义活动,因此将不胜感激。

4

2 回答 2

0

根据上面链接的讨论,到目前为止我想出了这个......下载监听器接口

公共接口 DataDownloadListener { void onDownloadStarted(); 无效 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();
  }
于 2012-10-02T14:35:22.800 回答
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{...})
于 2012-10-02T17:15:45.697 回答