2011-10-10 121 views
2

我在尝试更新集成在通知栏中的进度条,但似乎无法使其工作。我有种想法,为什么它不起作用,但我不知道如何解决它。这是代码:从IntentService更新进度条?

public class DownloadService extends IntentService{ 

    public DownloadService() { 
     super("DownloadService"); 


    } 

     @Override 
     public void onCreate() { 
      super.onCreate(); 
      ctx = getApplicationContext(); 
      root = new File(Environment.getExternalStorageDirectory()+"/folder-videos/"); 
      if(root.exists() && root.isDirectory()) { 

      }else{ 
       root.mkdir(); 
      }   
      notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
      PendingIntent contentIntent = PendingIntent.getActivity(this, 0, null, 0); 

      notification = new Notification(R.drawable.icon, "App", System.currentTimeMillis()); 
      contentView = new RemoteViews(getPackageName(), R.layout.progress_layout); 
      notification.flags = Notification.FLAG_AUTO_CANCEL; 
      notification.contentView = contentView; 
      notification.contentIntent = contentIntent; 
      contentView.setProgressBar(R.id.status_progress, 100, 0, false);   
      contentView.setTextViewText(R.id.status_text,"Downloading..."); 

     } 

     @Override 
    protected void onHandleIntent(Intent intent) { 
     Intent broadcastIntent = new Intent(); 

     int count; 
     String full_url = URL + intent.getStringExtra(VIDEOS); 

     try { 
      URL url = new URL(full_url); 
      URLConnection conexion = url.openConnection(); 
      conexion.connect(); 
      File file = new File(root.getPath(), intent.getStringExtra(VIDEOS)); 

      int lenghtOfFile = conexion.getContentLength(); 
      Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); 

      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream(file); 

      byte data[] = new byte[1024]; 

      long total = 0; 
      contentView.setTextViewText(R.id.status_text,"Downloading " + intent.getStringExtra(VIDEOS)); 
      while ((count = input.read(data)) > 0) { 
       total += count;  
       notification.contentView.setProgressBar(R.id.status_progress, 100,(int)((total*100)/lenghtOfFile), false);  
       Log.e("totaltotal","" + (int)((total*100)/lenghtOfFile)); 
       output.write(data, 0, count); 


      } 
      notificationManager.notify(1,notification); 
      output.flush(); 
      output.close(); 
      input.close(); 
     } catch (Exception e) { 
      Log.e("PRINTSTACK","STACK:" + e.getMessage()); 
      e.printStackTrace(); 
     } 

    } 
} 

我知道我必须调用:notificationManager.notify(1,notification);在while循环内,我试过了,但它冻结了应用程序并崩溃了。是否有任何其他方式通知通知管理器进度条更新。

谢谢!

回答

3

尝试使用notificationManager.notify(1,notification);只有几次

为:

int lastProgressUpdate=0; 
while(...) 
{ 
    if(progress%5==0 && progress!=lastProgressUpdate) 
    { 

     notificationManager.notify(1,notification); 
     lastProgressUpdate=progress; 
    } 
} 
+0

5试了一下它仍然保持冻结UI。虽然尝试了10次,但我仍然可以将通知栏拉下来,但它会变得很慢并且冻结。 – bytebiscuit

+0

是否有某种NotificationListener监听更新并通知NotificationManager。 – bytebiscuit

+0

请尝试更新回答 –