在android中创建自定义事件的问题

时间:2012-10-02 14:20:45

标签: java android events callback listener

我正在撰写自定义活动,并希望得到一些帮助。我要讨论的大部分内容都是基于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方法?在主要活动的导入部分的课外?以前从未做过自定义活动,所以任何帮助都会受到赞赏。

2 个答案:

答案 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{...})