我有3个片段。这些片段被放入TabsAdapter中,用于在这些片段之间进行转换。
问题是,当应用程序加载并创建fragmentA视图时,它会下载图像,然后更改图像视图:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
this.myFragmentView = inflater.inflate(R.layout.foto_setmana, container, false); //Això conté els "edittext i altres"
new DownloadImageTask(myFragmentView).execute("http://192.168.1.35/testing/fotos/foto1.jpg");
}
}
DownloadImageTask中的代码:
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
View myfragmentview;
public DownloadImageTask(View myfragmentview) {
this.myfragmentview=myfragmentview;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
Log.d("debugging","mIcon11"+mIcon11.getHeight());
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
ImageView imv=(ImageView)this.myfragmentview.findViewById(R.id.imageView1);
imv.setImageBitmap(result);
}
所以这就是发生的事情:
1.-我点击了应用程序 2.-应用程序加载。在应用有时间检索图像之前拍摄此屏幕。 3.-当它检索图像时,显示它。 4.-我将片段滑到下一个片段。 5.-第二个片段 6.-我再次滑动到第3个片段。 7.第3个片段。 8.我回到第一个片段,图像不再加载。显然我不会再次调用DownloadImageTask,因为它会减慢用户的体验。
我该怎么做才能保留图像?
哦,顺便说一下。如果我只是从第1个扫到第2个,图像不会“卸载”,只要我转到第3个或更远的地方就会发生。知道为什么会这样吗?我只是对此感到好奇。
谢谢!
答案 0 :(得分:1)
使用LruCache创建位图的RAM缓存。
这篇精彩的Google IO讲座详细解释了如何使用它: http://youtu.be/gbQb1PVjfqM?t=5m
答案 1 :(得分:0)
我发现了一种有效的方式:
我们要做的是在片段上创建一个变量来知道我们是否下载了,另一个是保存位图,例如:
int downloaded;
Bitmap pictureSaved;
然后我们从片段的“onAttach”方法初始化它。
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.downloaded=0;
}
之后,在“主要代码”上:
if (this.downloaded==0){
//we're here if we didn't download yet
new DownloadImageTask(myFragmentView, this).execute("http://192.168.1.33/testing/fotos/foto1.jpg");
this.downloaded=1;
} else if(this.downloaded==1) {
//we're here if we already downloaded.
ImageView imv=(ImageView)myFragmentView.findViewById(R.id.imageView1);
imv.setImageBitmap(this.pictureSaved);
}
DownloadImageTask代码,应该下载图像,正如你所看到的,我传递给他的构造函数“this”,所以我可以访问片段方法和变量。
我在片段中创建了一个方法来更新图片:
public void update(Bitmap updated){
ImageView imv=(ImageView)myFragmentView.findViewById(R.id.imageView1);
this.pictureSaved=updated;
imv.setImageBitmap(this.pictureSaved);
this.downloaded=1;
}
DownloadImageTask会像这样调用片段的方法。 变量:
MyFragment frag;
构造
public DownloadImageTask(View myfragmentview, MyFragmentA parent) {
this.myfragmentview=myfragmentview;
this.frag=parent;
}
PostExecute:
protected void onPostExecute(Bitmap result) {
frag.update(result);
}
效果很好。
希望这有助于某人。