2011-11-12 4 views
1

私のアプリには4つのボタンがあり、ボタンをクリックするとファイルのダウンロードが開始され、進行状況バーが通知領域に表示されます。ダウンロードはバーが閉じられてきていないの進行状況を完了すると、私は4を持っている上に述べたようにダウンロードし、プログレスバーが正常に動作しているが、私は次のような2つの問題通知領域の進行状況バーが閉じておらず、2番目のプログレスバーが起動していない

  1. を持って、それが通知領域
  2. のまま最初のボタンをクリックするとダウンロードが開始され、他の3つのボタンがクリックされるとすぐにダウンロードは行われません。最初のダウンロードが完了した後に起動すると思っていました。しかし、何も起こりません。すべてのボタンは、以下の

をクリックしたときにすべてのプログレスバーを表示する方法私のコードである(ここで私は唯一の2つのボタンが追加されている)plsは私を助けて

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

私は本当に申し訳ありませんが、私は問題をタイプすることを考え、私はaであることをスペルミスしました。ちょうど今私が気づいた、私は私のタイトルを変更します –

+0

良い、ありがとう。 :) –

+1

繰り返しのいずれかで実際の作業を実際に行うつもりなら、なぜループがありますか?これは意味のある*進歩をもたらさないでしょう。 –

答えて

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

1-、getActivityで2番目のパラメータは、()requestCodeあり、それがあるべき各ボタンの固有の番号。両方のボタンで現在は0です。

notificationManager.notify(42, notification); 

2 - 上記の行では、通知インデックスを42として渡すと、両方のボタンで一意でなければなりません。現在のところ、作成するボタンの数にかかわらず、それぞれ42個を渡すので、新しい通知を表示することはありません。それは現在のものを更新し続けます。

また、onHandleIntent()で行っているコードをもう一度見直す必要があるかもしれません。これを行うより良い方法があります。

+0

あなたの権利はあなたのものよりずっとあり、それぞれのボタンの進捗バーがあります。しかし、まだ私は問題があります...最初の進行状況バーだけが完了し、他は進行しません。そして、最初の進行状況バーは完了しても閉じられません。 –

+0

完了後に進行状況バーがキャンセルされますが、特定の時点の後に他の進行状況バーに進行状況の変化はありません。たとえば25%です。 .. –

0

AsyncTaskListViewです。 ダウンロードマジックはAsyncTaskで発生します。 実行中のダウンロードと実行中の各ダウンロードの進行状況を示すArrayなどを作成します。 あなたのAsyncTaskにはを呼び出すpublishProgressというメソッドがあります。 onProgressUpdateでは、それぞれの進捗変数を更新し、ListViewアダプタでnotifyDataSetChangedを呼び出す必要があります。 これにより、ListViewはすべてのデータを再読み込みします。 最後にListView -Adapterには、getViewというメソッドがあります。そこでは、ListViewの各行のビューを作成する必要があります。 ProgressBar(ダウンロードの実行中)を表示するかどうかを決めることができます。

AsyncTaskの詳細については、ここで見つけることができます:ここでリストビューについてhttp://labs.makemachine.net/2010/05/android-asynctask-example/ そしてより:この上記の行でAndroid : BaseAdapter how to?

+1

彼はワーカースレッドを開始するサービスを使用していますが、AsyncTaskは必要ありません。 AsyncTaskを使用していた場合、彼はサービスを探すための勧告を受けたでしょう。 – zmbq

+0

が同意すると、サービスはasynctaskよりも優れています(スクリーンを回転させるときのすべての問題を考える/数秒間アプリを離れること!)。とにかく、「ローダー」*がより良い選択肢になると信じています! (それは互換性パッケージで入手できます)http://developer.android.com/guide/topics/fundamentals/loaders.html –

関連する問題