【问题标题】:Prevent Downloading Existing File Again And Again防止一次又一次地下载现有文件
【发布时间】:2014-08-09 17:52:47
【问题描述】:

我正在开发一个简单的应用程序,我正在使用 Picasso Library 从 URl 下载图像。

但我一次又一次地下载同一个文件时遇到问题。当我运行这个应用程序时,它会下载已经存在的相同文件。

它改变了文件的名称,但文件总是相同的。

这是我的代码:

package com.example.imagedownloadsample;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Random;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;

import com.squareup.picasso.Callback.EmptyCallback;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;

public class MainActivity extends ActionBarActivity {

    String currentUrl = "http://8020.photos.jpgmag.com/3456318_294166_528c960558_m.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.image_download);

        final ImageView img = (ImageView) (findViewById(R.id.imageView1));
        final ProgressBar progressBar = (ProgressBar) findViewById(R.id.loading);

        Picasso.with(this).load(currentUrl).error(R.drawable.error_detail)
                .into(img, new EmptyCallback() {
                    @Override
                    public void onSuccess() {
                        progressBar.setVisibility(View.GONE);
                    }

                    @Override
                    public void onError() {
                        progressBar.setVisibility(View.GONE);
                    }
                });

        Picasso.with(this).load(currentUrl).into(target);

    }

    private Target target = new Target() {
        @Override
        public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
            new Thread(new Runnable() {
                @Override
                public void run() {

                    Random generator = new Random();
                    int n = 10000;
                    n = generator.nextInt(n);
                    String fname = "/Android/data/com.usd.pop/Image-" + n
                            + ".jpg";

                    File file = new File(Environment
                            .getExternalStorageDirectory().getPath() + fname);
                    if (file.exists())
                        file.delete();
                    try {
                        file.createNewFile();
                        FileOutputStream ostream = new FileOutputStream(file);
                        bitmap.compress(CompressFormat.JPEG, 100, ostream);
                        ostream.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            }).start();
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            if (placeHolderDrawable != null) {
            }
        }
    };

}

我试过了,但没用。

                Random generator = new Random();
                int n = 10000;
                n = generator.nextInt(n);
                String fname = "/Android/data/com.usd.pop/image-" + n
                        + ".jpg";

                File file = new File(Environment
                        .getExternalStorageDirectory().getPath() + fname);
                if (file.exists()) {
                    file.delete();
                }
                try {
                    file.createNewFile();
                    FileOutputStream ostream = new FileOutputStream(file);
                    bitmap.compress(CompressFormat.JPEG, 100, ostream);
                    ostream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }

【问题讨论】:

  • 如果文件存在调用中断..不要下载然后删除它
  • break 或 return 将起作用...

标签: android android-sdcard android-file


【解决方案1】:
if (file.exists())
file.delete();

上述条件总是会返回false,因为你每次都在生成随机文件名。

另外,我没有看到任何代码可以更改 currentUrl,因此即使您运行多次,相同的文件也会以不同的文件名下载

【讨论】:

  • 那么我如何下载文件为URL名称而不是random
  • 我没有正确理解您的要求。如果你想点击相同的 URL 并删除旧的已经下载的文件,那么你可以删除 if 条件,因为FileOutputStream 将覆盖现有的文件内容。
  • 实际上我想跳过或覆盖现有的但我不知道如何,所以我想删除现有的。或者你能告诉我如何将文件保存为与 URL 相同的名称。
  • 如果您不想在文件已经下载的情况下进行网络调用,那么毕加索会为您完成。
【解决方案2】:

从此代码更改:

Random generator = new Random();
            int n = 10000;
            n = generator.nextInt(n);
            String fname = "/Android/data/com.usd.pop/image-" + n
                    + ".jpg";

            File file = new File(Environment
                    .getExternalStorageDirectory().getPath() + fname);
            if (file.exists()) {
                file.delete();

到此代码:

String fileName = currentUrl.substring(
                        currentUrl.lastIndexOf('/') + 1,
                        currentUrl.length());

                String fname = "/Android/data/com.usd.pop/image-"
                        + fileName;

                File file = new File(Environment
                        .getExternalStorageDirectory().getPath() + fname);
                if (file.exists())
                    file.delete();

这会将文件保存为与 URL 文件名相同的名称

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2015-12-03
    • 2017-11-30
    • 2010-11-01
    • 2022-01-26
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多