2016-09-26 7 views
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); 
    } 

} 

しかし、問題は、すべてのファイルがダウンロードされる前に、私のループが開始されていることです。この問題の解決策について私にいくつかの賛成をお願いします。

+0

その不明確、問題を解決しました。私が見ていることは、いくつかのリストでループを開始し、期待されていることを実行中の 'Async task'を使用していることです。 –

+0

私はダウンロードするファイルが10から15であり、タスクを完了した後にループ(スライダ)で表示する必要があります。しかし、それらのファイルを完全にダウンロードする前に、ループが開始されました。私はこの前に完全なダウンロードの後に​​ループを開始する必要があります – Mahesh

+0

'for(int i = 0; i

答えて

1

私はあなたが親切に詳細にあなたの問題を説明し、求めているものを@Murtaza Khursheedフセインにありがとう

int downloadFlag = 0; 

if (mainModel.size() > 0) { 
    downloadFile(mainModel.get(downloadFlag)); 
} 

private void downloadFile(final FileModel model) { 
    new DownloadFileTask(TabRideActivity.this, model, new DownloadFileTask.Callback() { 
     @Override 
     public void onDownloadComplete(File result) { 

      if (result != null) { 

       listFiles.add(result); 
       downloadFlag++; 

       if (downloadFlag < mainModel.size()) { 
        downloadFile(mainModel.get(downloadFlag)); 
        Log.e("Download", "" + listFiles.size()); 
        Log.e("Download", "" + mainModel.size()); 
       } else { 
        Toast.makeText(TabRideActivity.this, "Download Finished", Toast.LENGTH_SHORT).show(); 
        Log.e("Download", "Finished"); 
       } 

      } 
     } 
    }).execute(); 
} 
関連する問題