使用Asynctask下载和保存文件无法正常工作

时间:2013-12-19 11:29:49

标签: android android-asynctask download

我使用以下类下载文件并将其保存到SD卡。

class DownloadFileAsync extends AsyncTask<String, String, String> {

            @SuppressWarnings("deprecation")
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                showDialog(DIALOG_DOWNLOAD_PROGRESS);
            }

            @Override
            protected String doInBackground(String... aurl) {
                int count;

            try {

            URL url = new URL(aurl[0]);
            URLConnection conexion = url.openConnection();
            conexion.connect();

            int lenghtOfFile = conexion.getContentLength();
            Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);

            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath()+"PurchasedFrames/"+filename);

            byte data[] = new byte[1024];

            long total = 0;

                while ((count = input.read(data)) != -1) {
                    total += count;
                    publishProgress(""+(int)((total*100)/lenghtOfFile));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
            } catch (Exception e) {}
            return null;

            }
            protected void onProgressUpdate(String... progress) {
                 Log.d("ANDRO_ASYNC",progress[0]);
                 mProgressDialog.setProgress(Integer.parseInt(progress[0]));
            }

            @Override
            protected void onPostExecute(String unused) {
                File file = new File("/sdcard/PurchasedFrames/", filename );
                Bitmap myBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
                     ImageView frame = (ImageView) findViewById(R.id.frame);
                     frame.setImageBitmap(myBitmap);
                dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
            }
        }

对话方法

protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DIALOG_DOWNLOAD_PROGRESS:
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setMessage("Downloading file..");
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(false);
            mProgressDialog.show();
            return mProgressDialog;
        default:
            return null;
        }
    }

我的问题使用上面的代码,progressBar会出现,但它会在没有完成的情况下消失,也不会发生下载。我没有注意到任何 logcat 错误或调试中的任何其他错误。任何人都能说出可能发生的事情或如何克服这个问题吗?

1 个答案:

答案 0 :(得分:1)

所以我的假设是正确的。在我的应用程序中,我使用静态方法返回调用mkdirs()的文件路径,以防此类路径不存在。

对于您的代码,此类方法看起来如此:

public static File getSaveFilePath(String fileName) {
    File dir = new File(Environment.getExternalStorageDirectory(), "PurchasedFrames");
    dir.mkdirs();
    File file = new File(dir, fileName);

    return file;
}

然后用输出流替换该行:

OutputStream output = new FileOutputStream(getSaveFilePath(fileName));

同时用catch (Exception e) { Log.e("DownloadFileAsync", e.toString()); "}

替换您的例外块