1

サービスで開始されたスレッドで画像をダウンロードしています。すべて正常に動作しているが、私はMainActivity/UI Thread内でProgressBarの進捗状況を示したい。ブロードキャストメッセージでこれをやりたい下のコードでわかるように、私はスレッドを開始したサービスのwhileループでsendBroadcastメソッドを呼び出しています。画像は完全にダウンロードされた最後のサイクルで1回だけ動作します。したがって、Progressbarは最後に100%を示します。私の質問です:なぜそれは最後にのみ呼び出され、私はそれについて何ができますか?sendBroadcastはwhileループで1回だけ送信しています

編集:ブロードキャストメッセージを使用する必要があります。それは大学の運動です。

スレッド内の関連するコード:

URL url = null; 
    int fileSize = 0; 


    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    InputStream is = null; 
    try { 
     url = new URL(src); 
     URLConnection connection = url.openConnection(); 
     connection.connect(); 
     fileSize = connection.getContentLength(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     Log.d("LOG", "URL not found"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.d("LOG","Couldnt get Size of the file from this connection - No File found"); 
    } 
    try { 
     is = url.openStream(); 
     byte[] byteChunk = new byte[1024]; 
     Intent progressIntent = new Intent(); 
     progressIntent.setAction(Constants.ACTION.UPDATE_PROGRESSBAR); 
     int n; 
     int currentSize = 0; 
     while ((n = is.read(byteChunk)) > 0) { 
      currentSize = currentSize + n; 
      baos.write(byteChunk, 0, n); 
      progressIntent.putExtra("imgName", imgName); 
      progressIntent.putExtra("progressValue", (int) ((currentSize/fileSize)*100)); 
      runningService.sendBroadcast(progressIntent); 
     } 

私の受信機:

public class Receiver extends BroadcastReceiver{ 

MainActivity main; 

public Receiver(){}; 

public Receiver(MainActivity main){ 
    this.main = main; 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    if(intent.getAction().equals(Constants.ACTION.TRANSFER_BYTEARRAY)){ 
     byte[] byteArray = intent.getByteArrayExtra("imgBA"); 
     String imgName = intent.getStringExtra("imgName"); 
     main.setDownloadedImg(byteArray,imgName); 
    } else if (intent.getAction().equals(Constants.ACTION.UPDATE_PROGRESSBAR)) { 
     String imgName = intent.getStringExtra("imgName"); 
     int progressValue = intent.getIntExtra("progressValue",0); 
     main.updateProgressBar(imgName, progressValue); 
    } 
} 

}私は非常に多くのブロードキャストメッセージを送信しないことをお勧め

+0

私は何が起こるのかを知っていますが、ちょっとした修正があります:あなたの意図をループ内でインスタンス化すると、役立ちますか? –

+0

いいえ、助けてください。テストしました:/ –

+0

したがって、ダウンロードを行うスレッドと同じスレッドで進行状況を処理する可能性があります。そのため、更新内容はUIを描画するスレッドでは保証されません。 UIで何かを更新する必要があるものについては、 'Activity.runOnUIThread'を使用してください。 –

答えて

0

。このためにオブザーバーパターンを使用することができれば、より専門的になります。 Hereは使い方をよく説明しています。そして、あなたのMainActivityは、プログレスバーを処理する場合

public interface ProgressChangeListener{ 
    void onProgressChanged(int percent); 
} 

:あなたはプログレスバーを更新するための一つの方法が含まれているインタフェースを作成する必要があり

  1. は、基本的には3段階ありインターフェイスはMainActivityによって実装される必要があります。

  2. イメージをダウンロードするスレッドをインスタンス化するときには、このリスナーを実装する基本的にMainActivityとなるタイプのオブジェクトProgressChangeListenerを渡す必要があります。

  3. 最後に、進捗値が変更された場合は、スレッド内でそのオブジェクトのonProgressChangedメソッドを呼び出すだけです。

このソリューションは、ブロードキャストメッセージよりもうまく機能し、はるかにエレガントです。

+0

あなたの答えをありがとう。それは大学の運動で、ボラードキャ​​ストのメッセージを使用する必要があります。もし私がwouldntすれば私はAsyncTaskを使用していたと思います。病気を私の質問に加えてください。 –

+0

@ L.Rex、あなたは実際にAsyncTaskを使用する必要があります、私はかなり確信しています。進行状況がUIをレンダリングするスレッドと同じスレッドで更新された場合、UIは最後の更新まで進捗状況を表示しません。 –

+0

よくAsyncTaskはスレッドだけでなく、私が知っている限り.. –

関連する問題