使用Picasso优化来自Amazon S3的图像存储/获取请求

时间:2016-02-11 23:15:21

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

我正在创建一个轮询应用,每个民意调查都会有一个特定主题的关联图像。

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

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

        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) {

        }
    });

1 个答案:

答案 0 :(得分:3)

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

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

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