我正在创建一个轮询应用,每个民意调查都会有一个特定主题的关联图像。
我正在使用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) {
}
});
答案 0 :(得分:3)
首先,Picasso实例默认会保留一个内存缓存(或者你可以配置它)。
其次,磁盘缓存由HTTP客户端完成。您应该在2016年使用OkHttp 3+。默认情况下,如果您在依赖项中包含OkHttp,Picasso将使用OkHttp制作合理的默认缓存。您还可以在创建Picasso实例时设置Downloader(确保在客户端上设置缓存并使用OkHttpDownloader或类似)。
第三,OkHttp将尊重缓存标头,因此请确保max-age和max-stale具有适当的值。