sendBroadcast只发送一次while循环

时间:2017-11-10 13:39:00

标签: android multithreading while-loop broadcastreceiver broadcast

我正在下载一个在服务中启动的线程中的图像。一切正常,但我想在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);
    }
}

}

1 个答案:

答案 0 :(得分:0)

我建议不要发送这么多广播消息。如果您可以使用观察者模式,那将更专业。 Here很好地解释了如何使用它。

基本上有3个步骤:

  1. 您必须创建一个界面,其中包含一个更新进度条的方法:

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

    如果您的MainActivity处理进度条,那么界面应该由MainActivity实现。

  2. 当你实例化下载图像的线程时,你必须传递一个ProgressChangeListener类型的对象,它基本上是你的MainActivity,它实现了这个监听器。

  3. 最后,当进度值发生变化时,您只需在线程中调用该对象的onProgressChanged方法。

  4. 此解决方案比广播消息效果更好,而且更优雅。