【问题标题】:Optimize Image Storage / Get Requests from Amazon S3 with Picasso使用 Picasso 优化图像存储/从 Amazon S3 获取请求
【发布时间】:2016-02-12 10:02:28
【问题描述】:

我正在创建一个投票应用程序,每个投票都会有一个特定主题的相关图像。

我正在使用 Firebase 在事件发生时动态更新投票。在 Firebase 中,我存储了相关的图像 URL(引用 Amazon S3 中的 URL),然后我使用 Picasso 将图像加载到客户端的设备上(参见下面的代码)。

我已经注意到我处理这些数据的效率可能很低,导致对我在 S3 中的 Amazon 文件的不必要的 Get 请求。我想知道毕加索有什么选择(即我正在考虑一些缓存)来为每个客户端提取一次图像并将它们存储在本地(但是我不希望它们永久保留在客户端的设备上)。我的目标是最小化成本但不影响性能。以下是我当前的代码:

        mPollsRef.child(mCurrentDateString).child(homePollFragmentIndexConvertedToFirebaseReferenceImmediatelyBelowDate).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            int numberOfPollAnswersAtIndexBelowDate = (int) dataSnapshot.child("Poll_Answers").getChildrenCount();
            Log.e("TAG", "There are " + numberOfPollAnswersAtIndexBelowDate + " polls answers at index " + homePollFragmentIndexConvertedToFirebaseReferenceImmediatelyBelowDate);
            addRadioButtonsWithFirebaseAnswers(dataSnapshot, numberOfPollAnswersAtIndexBelowDate);
            String pollQuestion = dataSnapshot.child("Poll_Question").getValue().toString();
            mPollQuestion.setText(pollQuestion);

            //This is where the image "GET" from Amazon S3 using Picasso begins; the URL is in Firebase and then I use that URL
            //with the Picasso.load method
            final String mImageURL = (String) dataSnapshot.child("Image").getValue();
            Picasso.with(getContext())
                    .load(mImageURL)
                    .fit()
                    .into((ImageView) rootView.findViewById(R.id.poll_image));


        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

【问题讨论】:

    标签: amazon-web-services amazon-s3 firebase picasso


    【解决方案1】:

    首先,Picasso 实例会默认保存一个内存缓存(或者您可以配置它)。

    其次,磁盘缓存由 HTTP 客户端完成。您应该在 2016 年使用 OkHttp 3+。默认情况下,如果您在依赖项中包含 OkHttp,Picasso 将使用 OkHttp 进行合理的默认缓存。您还可以在创建 Picasso 实例时设置 Downloader(确保在客户端设置缓存并使用 OkHttpDownloader 或类似的)。

    第三,OkHttp 会尊重缓存头,因此请确保 max-age 和 max-stale 具有适当的值。

    【讨论】:

    • 谢谢!自动添加 OkHttp 库作为依赖会做默认缓存吗?
    • 是的,如果 OkHttp 可用,就会使用这个:github.com/square/picasso/blob/master/picasso/src/main/java/com/…
    • 您可以查看上面使用的 Utils 方法来查看使用的默认缓存。
    • 谢谢!我会试一试,看看我是否注意到性能提高和 S3 使用量减少
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2021-10-18
    • 2013-12-20
    • 2021-11-14
    • 2016-08-05
    • 2014-01-27
    • 2012-06-02
    相关资源
    最近更新 更多