2017-04-20 104 views
-2

我正在構建一個應用程序,用戶可以在其中下載壁紙或直接將其保存到桌面。如何在android中添加下載計數器(下載次數)?

我現在要做的是在Textview中添加一個下載計數器或下載次數,它將顯示該特定圖像的下載總數。換句話說,特定圖像被其他用戶下載的次數。

我不知道該怎麼做,我猜我可以使用谷歌分析,但有沒有辦法做到這一點,而不使用任何庫或服務?

+1

爲什麼你不能在本地存儲變量? – creativecreatorormaybenot

+0

本地變量將不起作用,因爲我希望所有用戶都看到圖像已下載了多少次。 –

+0

我想我理解你的問題。因此,爲了澄清,您將圖像存儲在服務器上的哪個位置以及用戶如何獲取這些圖像的網址? –

回答

0

它是一個非常簡單的任務,你必須做在服務器端和設備方面的一些變化,以及。

在服務器端的變化:
1.添加DB用表來記錄圖像的細節,如IMAGE_URL,IMAGE_NAME,image_id等。(確保有一個合法的主鍵),然後添加最重要的東西,即下載次數。
2.在您的API調用服務器獲取圖像細節的地方,添加另一個下載數量參數。
3.創建另一個終點來更新成功的下載。

變化對設備側:
1.一旦下載成功,讓您的新API的調用,這樣服務器將更新數據庫下載的數量。
2.現在這裏是有趣的部分,如果您的下載成功,那麼在您的textview中,您應該增加您之前從服務器收到的下載計數。
3.如果您希望下載次數是動態的,也就是說,如果您想每次下載圖像時更新下載次數,則可以使用Firebase Dynamic DB

步驟使用火力地堡動態DB
1.火力地堡動態DB是免費的,如果你使用這個,你不會有任何數據庫添加到您的服務器,因爲我在上面步驟中提到。
3. Firebase DB的實現起來並不複雜,因此花點時間理解它爲其設計模式。
4. Firebase數據庫具有以下功能:具有訪問權限的任何客戶端都可以更新數據庫中的值,並且此更新將自動通知給在數據庫上具有偵聽器的其他客戶端。此功能可以讓您獲得最新的下載次數,而無需再次進行服務器調用。
5.最重要的一步,一旦你下載的是成功,更新火力地堡動態數據庫,使所有的客戶得到了最新的價值通知,你可以用它來更新TextView

我建議你使用Firebase數據庫是因爲它速度很快,並且您不必在服務器上執行額外的工作,以及最重要的部分,如果您希望將推送通知添加到您的應用中,則可以使用相同的Firebase項目來添加推送通知。

+0

謝謝@MohammedAtif。 –

+0

@SohamChaudhari試試這個方法,如果它起作用,那麼標記它是正確的,如果你在某處發表評論,請點擊此處。 –

0
  1. 創建一個靜態整數變量。
  2. 開始下載增加計數器
  3. 在每次下載完成或錯誤時減少計數器。

因此,櫃檯會爲您提供確切的正在進行的圖像下載。

0

此方法將允許您執行一些後臺進程並同時更新UI(在這種情況下,我們將更新進度欄)。

這是一個例子代碼:

//聲明對話框,您的活動中的一員現場

ProgressDialog mProgressDialog; 

// instantiate it within the onCreate method 
mProgressDialog = new ProgressDialog(YourActivity.this); 
mProgressDialog.setMessage("A message"); 
mProgressDialog.setIndeterminate(true); 
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
mProgressDialog.setCancelable(true); 

//執行此當下載必須被解僱 最終DownloadTask downloadTask =新DownloadTask (YourActivity.this); downloadTask.execute(「您要下載的文件的網址」);

mProgressDialog.setOnCancelListener(新DialogInterface.OnCancelListener(){ @覆蓋 公共無效onCancel(DialogInterface對話框){ downloadTask.cancel(TRUE);} }); AsyncTask將如下所示:

//通常,AsyncTask的子類在活動類中聲明。 //這樣一來,你可以很容易地從這裏 私有類DownloadTask修改UI線程擴展的AsyncTask {

private Context context; 
    private PowerManager.WakeLock mWakeLock; 

    public DownloadTask(Context context) { 
     this.context = context; 
    } 

    @Override 
    protected String doInBackground(String... sUrl) { 
     InputStream input = null; 
     OutputStream output = null; 
     HttpURLConnection connection = null; 
     try { 
      URL url = new URL(sUrl[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      // expect HTTP 200 OK, so we don't mistakenly save error report 
      // instead of the file 
      if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { 
       return "Server returned HTTP " + connection.getResponseCode() 
         + " " + connection.getResponseMessage(); 
      } 

      // this will be useful to display download percentage 
      // might be -1: server did not report the length 
      int fileLength = connection.getContentLength(); 

      // download the file 
      input = connection.getInputStream(); 
      output = new FileOutputStream("/sdcard/file_name.extension"); 

      byte data[] = new byte[4096]; 
      long total = 0; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       // allow canceling with back button 
       if (isCancelled()) { 
        input.close(); 
        return null; 
       } 
       total += count; 
       // publishing the progress.... 
       if (fileLength > 0) // only if total length is known 
        publishProgress((int) (total * 100/fileLength)); 
       output.write(data, 0, count); 
      } 
     } catch (Exception e) { 
      return e.toString(); 
     } finally { 
      try { 
       if (output != null) 
        output.close(); 
       if (input != null) 
        input.close(); 
      } catch (IOException ignored) { 
      } 

      if (connection != null) 
       connection.disconnect(); 
     } 
     return null; 
    } 

以上(doInBackground)的方法始終運行在後臺線程。你不應該在那裏做任何UI任務。在另一方面,onProgressUpdate和onPreExecute UI線程上運行,所以你可以改變進度條:

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // take CPU lock to prevent CPU from going off if the user 
     // presses the power button during download 
     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
      getClass().getName()); 
     mWakeLock.acquire(); 
     mProgressDialog.show(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     super.onProgressUpdate(progress); 
     // if we get here, length is known, now set indeterminate to false 
     mProgressDialog.setIndeterminate(false); 
     mProgressDialog.setMax(100); 
     mProgressDialog.setProgress(progress[0]); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     mWakeLock.release(); 
     mProgressDialog.dismiss(); 
     if (result != null) 
      Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show(); 
     else 
      Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show(); 
    } 

對於此運行,你需要的WAKE_LOCK權限。

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+0

我不認爲這是他問。他只是想知道如何計數。 –

+0

正是@MohammedAtif他們正在回答如何顯示下載進度! –