RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 856161
Accepted
V.March
V.March
Asked:2020-07-16 19:37:12 +0000 UTC2020-07-16 19:37:12 +0000 UTC 2020-07-16 19:37:12 +0000 UTC

如何跟踪 FileOutputStream 何时关闭

  • 772

我正在从服务器加载几个图像并写入应用程序的内存。

我是这样的:

在一个循环中,我运行一个获取图像并将其写入文件的方法。

将第一个文件写入内存后,下一个文件应该开始加载。所以我们循环到列表的末尾。

循环结束后,我启动了一个已经在手机上处理文件的方法。

但是,出现了一个问题——即使在循环结束时,流仍然是开放的FileOutputStream。并且在启动第二种方法的时候,并不是所有的流都被关闭了,也就是说,并不是所有的图片都被记录在了手机上。结果,第二种方法无法使用所有图片。

我做了第一种方法synchronized——我只实现了加载顺序,但这并不影响流。

问题是如何跟踪所有文件下载和记录的时刻。

因为我这样写文件:

FileOutputStream ostream = new FileOutputStream(targetImgFile);

首先想到的是跟踪方法的运行ostream.close()。我知道在它运行之后 - 所有文件都被记录下来。但我找不到信息如何跟踪它是否有效?或者任何人都可以提出任何替代方案?

====
UPD: 这是用于从服务器加载图像的类:

public class LoaderQR {
    private Context mContext;
    private String sourceImgPath; //address image on server
    private File targetImgFile; //

    public LoaderQR(Context context, String pathImg, File imgFile) {
        mContext = context;
        sourceImgPath = pathImg;
        targetImgFile = imgFile;
    }

    synchronized public void downloadImg() {

        Target target = new Target() {

            @Override
           public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {

                try {
                    FileOutputStream ostream = new FileOutputStream(targetImgFile);

                    if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream)) {
                        ostream.close();

                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {
            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {
            }
        };

        Picasso.with(mContext).load(sourceImgPath).into(target);
    }
}

=====
UPD-2:
相同的代码,但在“老派”版本中:

public class LoaderQR {
    private static final String TAG = "Download Task";
    private Context mContext;
    private String sourceImgPath; //address image on server
    private File targetImgFile; //

    public LoaderQR(Context context, String pathImg, File imgFile) {
        mContext = context;
        sourceImgPath = pathImg;
        targetImgFile = imgFile;
    }

    synchronized public void downloadImgOld() {
        try {
            URL url = new URL(sourceImgPath);//Create Download URl
            HttpURLConnection c = (HttpURLConnection) url.openConnection();//Open Url Connection
            c.setRequestMethod("GET");//Set Request Method to "GET" since we are grtting data
            c.connect();//connect the URL Connection

            //If Connection response is not OK then show Logs
            if (c.getResponseCode() != HttpURLConnection.HTTP_OK) {
                Log.e(TAG, "Server returned HTTP " + c.getResponseCode()
                    + " " + c.getResponseMessage());

            }

            FileOutputStream fos = new FileOutputStream(targetImgFile);//Get OutputStream for NewFile Location

            InputStream is = c.getInputStream();//Get InputStream for connection

            byte[] buffer = new byte[1024];//Set buffer type
            int len1 = 0;//init length
            while ((len1 = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len1);//Write new file
            }

            //Close all connection after doing task
            fos.close();
            is.close();

        } catch (Exception e) {

            e.printStackTrace();
            targetImgFile = null;

        }
    }
}  

问题是一样的 - 并非所有文件都有时间添加。
告诉我如何更好地检查所有文件是否已添加到手机内存中并且可以进一步使用它们?

android
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    woesss
    2020-07-20T01:46:30Z2020-07-20T01:46:30Z

    对于“老派”,您可以申请AsyncTask。我们给它一个列表,它会循环加载所有文件并在最后调用回调:

    public static class ImagesLoaderTask extends AsyncTask<List<LoaderQR>, Void, List<LoaderQR>> {
    
        public static interface DownloadCallback {
            public void downLoadCompleted(List<LoaderQR> list);
        }
    
        public ImagesLoaderTask(DownloadCallback callback) {
            this.callback = callback;
        }
    
        private DownloadCallback callback;
    
        @SafeVarargs
        @Override
        protected final List<LoaderQR> doInBackground(List<LoaderQR>... args) {
            List<LoaderQR> list = args[0];
            for (LoaderQR loaderQR : list) {
                loaderQR.downloadImgOld();
            }
            return list;
        }
    
        @Override
        protected void onPostExecute(List<LoaderQR> list) {
            callback.downLoadCompleted(list);
        }
    }
    

    我们用:

    ImagesLoaderTask.DownloadCallback callback = ImagesLoaderTask.DownloadCallback() {
        public void downLoadCompleted(List<LoaderQR> list) {
            // всё загружено - можно работать с файлами
        }
    };
    
    
    ImagesLoaderTask task = new ImagesLoaderTask(callback);
    task.execute(listOfLoaderQR); 
    
    • 1
  2. JavaJunior
    2020-07-16T22:29:00Z2020-07-16T22:29:00Z

    问题并不完全清楚,但是流的过度关闭是惊人的,使用如下代码:

    try (FileOutputStream ostream = new FileOutputStream(targetImgFile)) {
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream);
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5