0
私の仕事はサーバからmp4ファイルをダウンロードし、それをループで表示することです。私はION downloaderを使ってファイルをダウンロードしています。以下、私がこれまでにしようとしているコードです: -ファイルが完全にダウンロードされる前に表示されます
for (int i = 0; i < mainModel.size(); i++) {
downloadFile(mainModel.get(i));
}
private void downloadFile(final FileModel model) {
new DownloadFileTask(FilesActivity.this, model, new DownloadFileTask.Callback() {
@Override
public void onDownloadComplete(File result) {
if (result != null) {
listFiles.add(result);
if (listFiles.size() == mainModel.size()) {
Log.e("Downloading", "Complete");
startTimer();
}
}
}
@Override
public void onError(Exception e) {
Log.e(TAG, "Failed to download file.", e);
Toast.makeText(FilesActivity.this, "An error has occurred", Toast.LENGTH_SHORT).show();
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
}).execute();
}
DownloadFileTask.java
class DownloadFileTask extends AsyncTask<Void, Void, File> {
private final Context mContext;
private final Callback mCallback;
private Exception mException;
private FileModel fileModel;
long total = 0;
boolean download = false;
DownloadFileTask(Context context, FileModel fileModel, Callback callback) {
mContext = context;
mCallback = callback;
this.fileModel = fileModel;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected File doInBackground(Void... params) {
/*FileMetadata metadata = params[0];
long sizeOnServer = metadata.getSize();*/
try {
String fileName = "";
String url = "";
fileName = fileModel.getFile_name() + ".mp4";
url = fileModel.getVideo();
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File file = new File(path, fileName);
/* Make sure the Downloads directory exists. */
if (!path.exists()) {
if (!path.mkdirs()) {
mException = new RuntimeException("Unable to create directory: " + path);
}
} else if (!path.isDirectory()) {
mException = new IllegalStateException("Download path is not a directory: " + path);
return null;
}
/* Download the file. */
if (!file.exists()) {
Ion.with(mContext)
.load(url)
.progress(new ProgressCallback() {
@Override
public void onProgress(long downloaded, long total) {
Log.e("Downloading", "" + downloaded + "/" + total);
}
})
.write(new File(path, fileName))
.setCallback(new FutureCallback<File>() {
@Override
public void onCompleted(Exception e, File file) {
mCallback.onDownloadComplete(file);
}
});
}
/* Tell android about the file */
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file));
mContext.sendBroadcast(intent);
return file;
} catch (Exception e) {
mException = e;
}
return null;
}
@Override
protected void onPostExecute(File result) {
super.onPostExecute(result);
if (mException != null) {
mCallback.onError(mException);
} else {
mCallback.onDownloadComplete(result);
}
}
public interface Callback {
void onDownloadComplete(File result);
void onError(Exception e);
}
}
しかし、問題は、すべてのファイルがダウンロードされる前に、私のループが開始されていることです。この問題の解決策について私にいくつかの賛成をお願いします。
その不明確、問題を解決しました。私が見ていることは、いくつかのリストでループを開始し、期待されていることを実行中の 'Async task'を使用していることです。 –
私はダウンロードするファイルが10から15であり、タスクを完了した後にループ(スライダ)で表示する必要があります。しかし、それらのファイルを完全にダウンロードする前に、ループが開始されました。私はこの前に完全なダウンロードの後にループを開始する必要があります – Mahesh
'for(int i = 0; i