How to add ProgressDialog

前端 未结 4 1654
后悔当初
后悔当初 2020-12-12 04:20

I am downloading a file from dropbox which is taking a few seconds. I want to add a ProgressDialog for the download but I don\'t know how to do that.

         


        
4条回答
  •  北荒
    北荒 (楼主)
    2020-12-12 05:11

    This article can be useful for you:

    http://huuah.com/android-progress-bar-and-thread-updating/

    Where inside the run() method of your thread you can invoke a function like this:

     public boolean download(String url, String path, String fileName, Handler progressHandler) {
        try {
            URL sourceUrl = new URL(formatUrl(url));
            if (fileName == null || fileName.length() <= 0) {
                fileName = sourceUrl.getFile();
            }
            if (fileName == null || fileName.length() <= 0) {
                throw new Exception("EMPTY_FILENAME_NOT_ALLOWED");
            }
            File targetPath = new File(path);
            targetPath.mkdirs();
            if (!targetPath.exists()) {
                throw new Exception("MISSING_TARGET_PATH");
            }
            File file = new File(targetPath, fileName);
            URLConnection ucon = sourceUrl.openConnection();
            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            ByteArrayBuffer baf = new ByteArrayBuffer(100);
            int current = 0;
            int totalSize = ucon.getContentLength();
            while ((current = bis.read()) != -1) {
                baf.append((byte) current);
                // BEGIN - Handler feedback
                if (progressHandler != null && (baf.length() % 100) == 0) {
                    Message msg = progressHandler.obtainMessage();
                    Bundle b = new Bundle();
                    if (totalSize > 0) {
                        b.putInt("total", totalSize);
                        b.putInt("step", baf.length());
                        b.putBoolean("working", true);
                    }
                    msg.setData(b);
                    progressHandler.handleMessage(msg);
                }
                // END
            }
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(baf.toByteArray());
            fos.close();
            // BEGIN - Handler feedback
            if (progressHandler != null) {
                Message msg = progressHandler.obtainMessage();
                Bundle b = new Bundle();
                if (totalSize > 0) {
                    b.putInt("total", 0);
                    b.putInt("step", 0);
                    b.putBoolean("working", false);
                }
                msg.setData(b);
                progressHandler.handleMessage(msg);
            }
            // END
            return file.exists();
        }
    

    Doing this way, you have a more accurate feedback about real progress of you download (byte per byte).

提交回复
热议问题