0

カスタムイベントを書いているので、助けてください。私が話そうとしていることのほとんどは、Androidアプリのカスタムイベントリスナーで提供されるヘルプに基づいています

これが私の問題です。更新された画像をウェブからダウンロードし、電話に保存して、後でそれらの画像を表示する必要があるアプリを書いています。基本的に、スプラッシュ画面で必要な画像をダウンロードします。次に、画像をダウンロードして保存すると、スプラッシュ画面がクリアされ、必要な(新しくダウンロードされた)画像が画面に表示されます。問題は次のとおりです。ダウンロードプロセスは非同期タスクを介して実行されるため、画像が画面に読み込まれる部分を非同期タスク内で実行することはできません。これは、メイン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);
      }
 }

私の問題は、これらの指示の最後の2つのステップをどこに置くべきかわからないことです。実際にダウンロードを開始するクラス内にリスナーとイベントを配置する必要があると思いました。しかしここで?ダウンロードを開始してデバイスに保存する関数は次のとおりです。

 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

可能であれば静的にしないでください... ファイルをダウンロードするために使用するクラスでは、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 に答える
0

上記のリンクからの議論によると、私はこれまでのところこれを思いつきました...ダウンロードリスナーインターフェース

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);
      }
 }

Ok...

ダウンロード手順では、ダウンロードの開始時に、リスナーArrayList のすべての要素を循環させ、onDownloadStartedイベントを呼び出して、ダウンロードが開始されたことをすべてのリスナーに通知します (このイベントでは、スプラッシュスクリーン)。

ダウンロード手順では常に、ダウンロード時に、リスナーArrayList のすべての要素を循環させ、onDownloadFinishedイベントを呼び出して、ダウンロードが終了したことをすべてのリスナーに通知します (スプラッシュスクリーンを閉じます)。

ダウンロード完了時にリスナーを循環させる方法

  foreach(DataDownloadListener downloadListener: listeners){
        downloadListener.onDownloadFinished();
  }

ダウンロード開始時にリスナーを循環させる方法

  foreach(DataDownloadListener downloadListener: listeners){
        downloadListener.onDownloadStarted();
  }
于 2012-10-02T14:35:22.800 に答える