カスタムイベントを書いているので、助けてください。私が話そうとしていることのほとんどは、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メソッドで意味しますか?メインアクティビティのインポートセクションのクラス外ですか?これまでカスタムイベントを行ったことがないので、助けていただければ幸いです。