0

Я работаю с видом ресайклера, который выглядит следующим образом. enter image description hereИндикатор выполнения на RecyclerView

Я использую задачу async для управления загрузками. Я использую кнопку this, так что каждый элемент в списке карт может иметь ход соответствующей загрузки. Я не уверен, как сообщить о статусе загрузки в recyclerview. Как мне получить это, чтобы опубликовать обновления на карточках?

Код асинхронной Загрузчик это

public class DownloadFileFromURL extends AsyncTask<String, String, String> { 

    private final String resourceType; 

    public DownloadFileFromURL(String resourceType) { 
     super(); 
     this.resourceType = resourceType; 
     // do stuff 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     //showDialog(progress_bar_type); 
    } 


    protected void onProgressUpdate(String... progress) { 
     // setting progress percentage 
     //  pDialog.setProgress(Integer.parseInt(progress[0])); 
    } 

    @Override 
    protected String doInBackground(String... f_url) { 
     int count; 
     try { 

      URL url = new URL(f_url[0]); 
      String fileName = url.toString().substring(url.toString().lastIndexOf('/') + 1); 
      URLConnection connection = url.openConnection(); 
      connection.connect(); 

      // this will be useful so that you can show a tipical 0-100% 
      // progress bar 

      int lengthOfFile = connection.getContentLength(); 
      Log.d("lengthofFile", String.valueOf(lengthOfFile)); 
      // download the file 

      InputStream input = new BufferedInputStream(url.openStream(), 
        8192); 

      String destinationDirectory =""; 
      if(resourceType.equals(SyncUtil.IMAGE_ZIP)) 
      { 
       destinationDirectory= SyncUtil.TMP; 
      } 
      if(resourceType.equals(SyncUtil.VIDEOFILE)){ 
       destinationDirectory = SyncUtil.VIDEO; 
      } 

      File mFolder = new File(AppController.root.toString() + File.separator+destinationDirectory); 

      if (!mFolder.exists()) { 
       mFolder.mkdir(); 
      } 

      OutputStream output = new FileOutputStream(AppController.root.toString()+File.separator+destinationDirectory+File.separator 
        + fileName); 

      byte data[] = new byte[1024]; 

      long total = 0; 

      while ((count = input.read(data)) != -1) { 
       total += count; 
       // publishing the progress.... 
       // After this onProgressUpdate will be called 
       publishProgress("" + (int) ((total * 100)/lengthOfFile)); 
       output.write(data, 0, count); 
      } 


      output.flush(); 

      // closing streams 
      output.close(); 
      input.close(); 
      if(resourceType.equals(SyncUtil.IMAGE_ZIP)){ 
       BusProvider.getInstance().post(new ZipDownloadComplete(fileName,resourceType)); 
      } 
      if(resourceType.equals(SyncUtil.VIDEOFILE)){ 

        // BusProvider.getInstance().post(new VideoDownloadComplete(fileName)); 

      } 
     } catch (Exception e) { 
      Log.e("Error: ", e.getMessage()); 
     } 

     return null; 
    } 


    @Override 
    protected void onPostExecute(String file_url) { 


    } 

} 

ресайклера вид адаптера здесь

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    final Video video = videosList.get(position); 
    holder.title.setText(video.getTitle()); 
    holder.description.setText(video.getDescription()); 

    holder.downloadButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String url ="http://"+ AppController.serverAddr +":"+AppController.port +"/video/"+video.getUrl()+video.getExtension(); 
      DownloadFileFromURL downloadFileFromURL = new DownloadFileFromURL(SyncUtil.VIDEOFILE); 
      downloadFileFromURL.execute(url,video.getTitle(),video.getDescription()); 

     } 
    }); 
    holder.bind(video,listener); 
} 

ответ

2

Хотя его не очень хорошее решение, но в моем случае я получил это работает. Я просто делюсь своими мыслями с некоторым фрагментом кода кода.

Предполагаю, что вы показываете прогресс загрузки с помощью ProgressBar. Поэтому возьмите экземпляр ProgressBar в своем адаптере и передайте ссылку на ваш AsyncTask.

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    final Video video = videosList.get(position); 
    holder.title.setText(video.getTitle()); 
    holder.description.setText(video.getDescription()); 

    holder.downloadButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String url ="http://"+ AppController.serverAddr +":"+AppController.port +"/video/"+video.getUrl()+video.getExtension(); 

      // Pass the progressBar here. You might have to set it as a final variable. 
      DownloadFileFromURL downloadFileFromURL = new DownloadFileFromURL(SyncUtil.VIDEOFILE, holder.progressBar); 
      downloadFileFromURL.execute(url,video.getTitle(),video.getDescription()); 

     } 
    }); 
    holder.bind(video,listener); 
} 

Теперь измените свой конструктор AsyncTask следующим образом.

public DownloadFileFromURL(... , ProgressBar mProgressbar) { 
    this.mProgressbar = mProgressbar; 
    this.mProgressbar.setProgress(0); 
    this.mProgressbar.setMax(100); 
} 

Добавить onProgressUpdate в вашем AsyncTask

protected void onProgressUpdate(Integer... values) { 
    mProgressbar.setProgress(values[0]); 
} 

Сейчас в вашем doInBackground расчета размера файла и опубликовать прогресс после определенного файла загружается.

protected void doInBackground() throws IOException { 
    try { 
     // Establish connection 
     URL url = new URL(fileUrl); 
     HttpURLConnection connection = (HttpURLConnection) url 
       .openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     final String contentLengthStr = connection.getHeaderField("content-length"); 

     InputStream input = connection.getInputStream(); 
     String data1 = f.getPath(); 
     FileOutputStream stream = new FileOutputStream(data1); 

     byte data[] = new byte[4096]; 
     int count; 
     int progressCount = 0; 

     while ((count = input.read(data)) != -1) { 
      stream.write(data, 0, count); 
      progressCount = progressCount + count; 

      int progress = (int) (((progressCount * 1.0f)/Integer.parseInt(contentLengthStr)) * 10000); 

      // Publish your progress here 
      publishProgress(progress); 
     } 

     stream.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Примечание: Передача оригинал справки о ваших взглядах не очень хорошее решение. Я предпочел бы установить BroadcastReceiver в своей деятельности и опубликовать широковещательную рассылку с определенной позицией позиции в функции publishProgress. Поэтому, когда трансляция принимается в основном действии, я мог бы позвонить notifyDatasetChanged, чтобы получить эффект прогресса в списке.

+0

Это сработало. Как вы думаете, что нужно сделать, чтобы оптимизировать их больше? – 55597

+0

Замечательно, что он решил вашу проблему. В любом случае, прохождение исходной ссылки на ваши взгляды не очень хорошее решение. Я предпочел бы установить широковещательный приемник в своей деятельности и опубликовать широковещательную рассылку с определенной позицией позиции в функции «publishProgress». Таким образом, когда трансляция принимается в основном действии, я могу вызвать 'notifyDatasetChanged', чтобы добиться эффекта прогресса в списке. –

Смежные вопросы