2011-11-12 72 views
1

在我的應用程序中,我有4個按鈕,當用戶單擊任何按鈕時,它開始下載文件,進度條顯示在通知區域中。下載和進度條工作正常,但是當下載完成進度條是沒有得到關閉,我有以下兩個問題通知區域的進度條未關閉,未啓動第二個進度條

  1. ,但正如我所說的保持在通知區域
  2. 上述,我有4個按鈕,當第一個按鈕被點擊時,下載開始,當其他三個按鈕被立即點擊下載沒有發生。我認爲它可能會在第一次下載完成後開始。但沒有任何反應。如何顯示在所有的按鈕點擊

繼所有進度條是我的代碼(在這裏我僅添加了2個按鈕)請幫我

b1 = (Button)findViewById(R.id.button1); 
     b1.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       i =1; 
       Intent intent = new Intent(NotificationProgressTestActivity.this, UploadService.class); 
       startService(intent); 
      } 
     }); 

     b2 = (Button)findViewById(R.id.button2); 
     b2.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       i = 2; 
       Intent intent = new Intent(NotificationProgressTestActivity.this, UploadService.class); 
       startService(intent); 
      } 
     }); 

下一頁下面是我Uplaod Service.class

public class UploadService extends IntentService 
{ 
    private NotificationManager notificationManager; 
    private Notification notification; 
    private int progress = 10; 
    private static String fileName = "folder/"; 
    private static URL url; 
    public UploadService(String name) 
    { 
     super(name); 
    } 
    public UploadService() 
    { 
     super("UploadService"); 
    } 
    @Override 
    protected void onHandleIntent(Intent intent) 
    { 
     notificationManager = (NotificationManager) getApplicationContext().getSystemService(getApplicationContext().NOTIFICATION_SERVICE); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0); 
     notification = new Notification(R.drawable.icon,"Uploading file", System.currentTimeMillis()); 
     notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT; 
     notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.upload_progress_bar); 
     notification.contentIntent = contentIntent; 
     notification.contentView.setProgressBar(R.id.progressBar1, 100, progress, false); 
     notificationManager.notify(42, notification); 
     notificationManager.notify(42, notification); 
     Thread download = new Thread() 
     { 
      @Override 
      public void run() 
      { 
       Log.e("download", "start"); 
       try 
       { 
        for (int i = 1; i < 100; i++) 
        {  
         progress++; 
         notification.contentView.setProgressBar(R.id.progressBar1, 100, progress, false); 
         if(i==1) 
         { 
          if(NotificationProgressTestActivity.i ==1) 
          { 
           url = new URL("http://xxxxxxxxxxxxxxxx.mp4"); 
          } 
          else if(NotificationProgressTestActivity.i == 2) 
          { 
           url = new URL("http://xxxxxxxxxxxxxxxx.mp4"); 
          } 
          HttpURLConnection c = (HttpURLConnection) url.openConnection(); 
          c.setRequestMethod("GET"); 
          c.setDoOutput(true); 
          c.connect(); 

          String PATH = Environment.getExternalStorageDirectory()+ "/"; 
          Log.e("PATH:", PATH); 
          File file = new File(PATH); 
          if (!file.exists()) 
          { 
           file.mkdir(); 
           Log.e("destination", "created"); 
          } 
          else 
          { 
           Log.e("destination", "exist"); 
          } 
          File outputFile = new File(file, fileName); 
          FileOutputStream fos = new FileOutputStream(outputFile); 

          InputStream is = c.getInputStream(); 

          byte[] buffer = new byte[10171188]; 
          int len1 = 0; 
          while ((len1 = is.read(buffer)) != -1) 
          { 
           fos.write(buffer, 0, len1); 
          } 
          fos.close(); 
          is.close(); 
          // ----------------------- 
          if (!outputFile.exists()) 
          { 
           Log.e(outputFile.toString(), "not created"); 
          } 
          else 
          { 
           Log.e(outputFile.toString(), "created"); 
           Log.e(outputFile.toString(), "" + outputFile.length()); 
          } 
          Log.e("download", "end"); 
         } 
         notificationManager.notify(42, notification); 
         try 
         { 
          Thread.sleep(1017); 
         } 
         catch (InterruptedException e) 
         { 
          e.printStackTrace(); 
         } 
       } 
      } 
      catch (IOException e) 
      { 
         Log.e("log_tag", "Error: " + e); 
      } 
      Log.e("log_tag", "Check: "); 

       // remove the notification (we're done) 
      notificationManager.cancel(42); 
     } 
    }; 
     download.run(); 
    } 
+0

我真的很抱歉,我想到打字問題,我拼寫成s。剛纔我注意到,我將改變我的標題 –

+0

聽起來不錯,謝謝。 :) –

+1

爲什麼你有一個循環,如果你只是真的要在其中一個迭代中做任何真正的工作?這不會帶來有意義的進展。 –

回答

1
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0); 

在這上面的行1,在getActivity第二個參數()是requestCode,它應該是每個按鈕的唯一編號。目前這兩個按鈕都爲0。

notificationManager.notify(42, notification); 

2-在上面的行中,您傳遞的通知索引爲42,它應該對於兩個按鈕都是唯一的。目前無論您創建多少個按鈕,它都不會向您顯示新通知,因爲您每次都傳遞42個按鈕。它會不斷更新當前的一個。

此外,您可能還需要再次查看您在onHandleIntent()中執行的代碼。有更好的方法來做到這一點。

+0

thanx很多...你的權利,我得到每個按鈕的進度條。但仍然有問題...只有第一個進度條完成,而不是其他問題。第一個進度條在完成時並沒有關閉...... –

+0

我很抱歉進度條在完成後被取消,但在某個點之後的其他進度條中沒有進度變化,例如爲25%。 .. –

0

你需要的是一個AsyncTaskListView。 您的downloadmagic發生在AsyncTask中。 例如製作一個數組,指示正在運行哪個下載以及每個正在運行的下載的進度。 現在在您的AsyncTask中有一個publishProgress-方法,它調用onProgressUpdate。 在onProgressUpdate您必須更新相應的進度變量並在您的ListView適配器上調用notifyDataSetChanged。 這將導致ListView重新加載所有數據。 最後在您的ListView-適配器中,您獲得了一個方法getView,您必須在其中爲ListView的每一行創建視圖。 在那裏你可以決定顯示ProgressBar(下載運行)或不顯示。

有關的AsyncTask更多信息可以在這裏找到:http://labs.makemachine.net/2010/05/android-asynctask-example/ ,更多的是ListView的位置:Android : BaseAdapter how to?

+1

他使用啓動工作線程的服務,他不需要AsyncTask。如果他一直在使用AsyncTask,他會收到建議以開啓服務。 – zmbq

+0

同意,服務比asynctask更好(想想旋轉屏幕/離開應用程序幾秒鐘時的所有麻煩!)。無論如何,我相信一個'Loader'*可能是一個更好的選擇! (它可以在兼容性包中找到)http://developer.android.com/guide/topics/fundamentals/loaders.html –