2017-04-19 51 views
0

我有一個聊天應用程序,讓用戶通過Firebase發送圖像,視頻等,當其他用戶開始與Firebase數據庫同步時,它首先將文件下載到本地存儲中,如其他應用程序Whatapp,Messenger),然後從那裏玩。Android-避免文件從Firebase下載一次以上

但我的問題是每當用戶活動刷新所有文件一次又一次下載並使相同的文件的副本。我怎樣才能避免這種情況。

這裏是我從AsyncTask下載Firebase存儲的文件。

public class DownloadAttachment extends AsyncTask<Void, String, String> { 
    String DownloadUrl,fileName; 
    File file; 
    Context context; 
    ProgressBar progressBar; 
    public static final String TAG="###Download Attachment"; 

    public DownloadAttachment(Context context, String downloadUrl, String fileName) { 
     DownloadUrl = downloadUrl; 
     this.fileName = fileName; //UUID.randomUUID().toString() 
     this.context=context; 
    } 


    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     int count; 
     try { 
      File root = android.os.Environment.getExternalStorageDirectory(); 

      Log.d(TAG,"DO IN BACKGROUND RUNNING"); 
      File dir = new File(root.getAbsolutePath() + "/Downloaded Files/"); 
      if (dir.exists() == false) { 
       dir.mkdirs(); 
      } 


      URL url = new URL(DownloadUrl); //you can write here any link 
      file = new File(dir, fileName); 

      long startTime = System.currentTimeMillis(); 
      Log.d(TAG, "download begining"); 
      Log.d(TAG, "download url:" + url); 
      Log.d(TAG, "downloaded file name:" + fileName); 

     /* Open a connection to that URL. */ 
      URLConnection ucon = url.openConnection(); 

      //this will be useful so that you can show a typical 0-100% progress bar 
      int lengthOfFile=ucon.getContentLength(); 
     /* 
     * Define InputStreams to read from the URLConnection. 
     */ 
      InputStream is = ucon.getInputStream(); 
      BufferedInputStream bis = new BufferedInputStream(is); 

     /* 
     * Read bytes to the Buffer until there is nothing more to read(-1). 
     */ 
      ByteArrayOutputStream baf = new ByteArrayOutputStream(5000); 
      int current = 0; 
      long total=0; 
      while ((current = bis.read()) != -1) { 
       baf.write((byte) current); 
       total=total+current; 
       //PUBLISH THE PROGRESS 
       //AFTER THIS onProgressUpdate will be called 
       publishProgress(""+(int)(total*100)/lengthOfFile); 
      } 


     /* Convert the Bytes read to a String. */ 
      FileOutputStream fos = new FileOutputStream(file); 
      fos.write(baf.toByteArray()); 
      fos.flush(); 
      fos.close(); 
      Log.d("DownloadManager", "download ready in " + ((System.currentTimeMillis() - startTime)/1000) + " sec"); 
      Log.d(TAG,"File Path "+file); 

     } catch (IOException e) { 
      Log.d("DownloadManager", "Error: " + e); 
     } 

     return file.toString(); 
    }  

} 

我無法檢查文件的名稱因爲我使用UUID生成文件的隨機名稱。

請指導我這個問題

回答

1

在我看來,你可以保持下載文件表,在本地SQLite數據庫,包含兩列:

  • TAG:文件名或的一些獨特的ID文件
  • URI:存儲在設備上的 文件的URI /路徑。

在下載任何文件之前,您應該使用TAG列檢查其表項是否存在於表格中。如果確實如此,則不要從firebase下載,而是使用URI從設備中獲取它。如果不是,那麼您可以下載該文件並在表中爲該文件插入一行。

+0

你可能是對的,但它有可能我們應該等待一些更多的解決方案,然後再接受這個答案 – Ritu