我正在下载一个在服务中启动的线程中的图像。一切正常,但我想在MainActivity / UI Thread中显示ProgressBar的进度。我想通过广播消息来做到这一点。正如你在下面的代码中看到的那样,我在服务的while循环中调用sendBroadcast方法,我启动了该线程。它工作但在最后一个周期中只有一次完全下载图像。因此,进度条最终显示为100%。我的问题是:为什么它最终只被调用,我能做些什么呢?
编辑:我必须使用广播消息。这是一次大学练习。
线程中的相关代码:
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)
我建议不要发送这么多广播消息。如果您可以使用观察者模式,那将更专业。 Here很好地解释了如何使用它。
基本上有3个步骤:
您必须创建一个界面,其中包含一个更新进度条的方法:
public interface ProgressChangeListener{
void onProgressChanged(int percent);
}
如果您的MainActivity处理进度条,那么界面应该由MainActivity实现。
当你实例化下载图像的线程时,你必须传递一个ProgressChangeListener
类型的对象,它基本上是你的MainActivity,它实现了这个监听器。
最后,当进度值发生变化时,您只需在线程中调用该对象的onProgressChanged
方法。
此解决方案比广播消息效果更好,而且更优雅。