ProgressDialog upade во время загрузки изображения - PullRequest
3 голосов
/ 02 сентября 2011

Мне нужно загрузить изображение в 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 голос
/ 02 сентября 2011

Вам лучше вернуть растровое изображение из 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();
}

**

РЕДАКТИРОВАТЬ:

**
Как только inputtream достигает своего конца, вы больше не можете читать данные с него. Вместо этого вы должны записать 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());
}
1 голос
/ 02 сентября 2011

В doInBackground () вы должны использовать publishProgress (), чтобы показать обновление. Проверьте здесь в примере, использование publishProgress ();
http://developer.android.com/reference/android/os/AsyncTask.html

...