サービスで開始されたスレッドで画像をダウンロードしています。すべて正常に動作しているが、私は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);
}
}
}私は非常に多くのブロードキャストメッセージを送信しないことをお勧め
私は何が起こるのかを知っていますが、ちょっとした修正があります:あなたの意図をループ内でインスタンス化すると、役立ちますか? –
いいえ、助けてください。テストしました:/ –
したがって、ダウンロードを行うスレッドと同じスレッドで進行状況を処理する可能性があります。そのため、更新内容はUIを描画するスレッドでは保証されません。 UIで何かを更新する必要があるものについては、 'Activity.runOnUIThread'を使用してください。 –