当图片下载时,ProgressDialog更新

3

我需要在一个AsyncTask中下载一张图片并在progressDialog中显示进度,唯一我无法处理的是如何使用1024字节步骤正确更新进度条,当前我有以下代码但它不起作用

class DownloadImageTask extends AsyncTask<String, Integer, Void> {

    @Override
    protected Void doInBackground(String... url) {
        bitmap = DownloadImage(url[0]);
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... args) {
        mProgressDialog.setProgress(args[0]);
    }

    @Override
    protected void onPostExecute(Void unused) {
        ImageView img = (ImageView) findViewById(R.id.img);
        img.setImageBitmap(bitmap);
        img.setVisibility(View.INVISIBLE);              
        imgInfo = "Height: " + bitmap.getWidth() + " px" + "\n" + "Width: "
                + bitmap.getHeight() + " px" + "\n" + "File Size: "
                + fileSize / 1024 + " KB" + "\n" + "Image Name: "   
                + getString(R.string.img_name);             
        isDownloaded = true;          
        mProgressDialog.dismiss();
    }

    @Override
    protected void onPreExecute() {
        mProgressDialog = new ProgressDialog(AndroidActivity.this);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setMessage("Loading...");
        mProgressDialog.setCancelable(false);
        mProgressDialog.show();
    }

    private Bitmap DownloadImage(String URL) {
        InputStream in = null;
        try {
            in = OpenHttpConnection(URL);
            bitmap = BitmapFactory.decodeStream(in);
            in.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return bitmap;
    }

    private InputStream OpenHttpConnection(String urlString)
            throws IOException {
        InputStream in = null;
        int response = -1;
        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();
        try {
            HttpURLConnection httpConn = (HttpURLConnection) conn;
            httpConn.setAllowUserInteraction(false);
            httpConn.setInstanceFollowRedirects(true);
            httpConn.setRequestMethod("GET");
            httpConn.connect();
            fileSize = conn.getContentLength();
            response = httpConn.getResponseCode();
            if (response == HttpURLConnection.HTTP_OK) {
                in = httpConn.getInputStream();

                // loop with step 1kb
                byte data[] = new byte[1024];
                long total = 0;
                int count = 0;
                while ((count = in.read(data)) != -1) {
                    total += count;
                    publishProgress((int)(total*100/fileSize));
                } 

            }  
        } catch (Exception ex) {
            throw new IOException("Error connecting");
        }
        return in;
    }
}

有人能帮忙吗?
2个回答

1

你最好从 doInBackground 返回位图,并在 onPostExecute() 中将其作为参数获取

class DownloadImageTask extends AsyncTask<String, Integer, Bitmap> {

@Override
protected Bitmap doInBackground(String... url) {
    Bitmap bitmap = DownloadImage(url[0]);
    return bitmap ;
}

@Override
protected void onProgressUpdate(Integer... args) {
    mProgressDialog.setProgress(args[0]);
}

@Override
protected void onPostExecute(Bitmap bmp) {
    ImageView img = (ImageView) findViewById(R.id.img);
    img.setImageBitmap(bmp);
    img.setVisibility(View.INVISIBLE);              
    imgInfo = "Height: " + bitmap.getWidth() + " px" + "\n" + "Width: "
            + bitmap.getHeight() + " px" + "\n" + "File Size: "
            + fileSize / 1024 + " KB" + "\n" + "Image Name: "   
            + getString(R.string.img_name);             
    isDownloaded = true;          
    mProgressDialog.dismiss();
}

**

编辑:

**
一旦输入流到达其末尾,您将无法再从中读取任何数据。您应该将InputStream写入byte array,然后将字节数组转换为位图。

private Bitmap OpenHttpConnection(String urlString)
        throws IOException {
........
........
   byte data[] = new byte[1024];
   long total = 0;
   int count = 0;
   ByteArrayOutputStream bos = new ByteArrayOutputStream();

   while ((count = in.read(data)) != -1) {
       total += count;
       bos.write(data, 0, count);
       publishProgress((int)(total*100/fileSize));
   } 

   return BitmapFactory.decodeByteArray(bos.toByteArray(),0,bos.size());
}

所以我改变了代码,使位图进入参数,并在第92行检查了位图,当我将代码部分放在OpenHttpConnection中时,栏会得到更新,如果我将其删除,则恢复正常... - user924941
所以问题在于 while ((count = in.read(data)) != -1) { total += count; publishProgress((int)(total*100/fileSize)); } 这段代码会弄乱输入流,导致位图为空。有人有解决方法吗? - user924941
我已经编辑了我的回答。你不能多次读取一个 InputStream - Ron
1
那么你什么时候打算接受它作为答案呢?请告诉我 :) - Ron
@userSeven7s:在哪里编写 private Bitmap OpenHttpConnection()... 并如何调用它,它的目的是什么?? - Akhil Jain

1

那么你将不得不发布logcat错误以了解为什么会发生这种情况。 - sat
无法确定确切位置,如果您能指出第92行是哪个语句,那将非常有用。猜测是将progressDialog的dismiss移动到onPostExecute的第一行并进行检查。您的一个对象在postExecute中为null,可能是progressDialog或ImageView img。 - sat
嗯,第92行是imgInfo = "高度:" + bitmap.getWidth() + " 像素" + "\n" + "宽度:" + bitmap.getHeight() + " 像素" + "\n" + "文件大小:" + fileSize / 1024 + " KB" + "\n" + "图片名称:" + getString(R.string.img_name); 并且移动dismiss也没有帮助 :( - user924941
只需检查该特定行中哪个(变量或对象)为空。 - sat
抱歉问这么愚蠢的问题,但我该怎么做? - user924941
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接