如何保存之前加载的图像?

时间:2013-01-11 13:52:04

标签: android android-image

我有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);
}

所以这就是发生的事情: enter image description here

1.-我点击了应用程序 2.-应用程序加载。在应用有时间检索图像之前拍摄此屏幕。 3.-当它检索图像时,显示它。 4.-我将片段滑到下一个片段。 5.-第二个片段 6.-我再次滑动到第3个片段。 7.第3个片段。 8.我回到第一个片段,图像不再加载。显然我不会再次调用DownloadImageTask,因为它会减慢用户的体验。

我该怎么做才能保留图像?

哦,顺便说一下。如果我只是从第1个扫到第2个,图像不会“卸载”,只要我转到第3个或更远的地方就会发生。知道为什么会这样吗?我只是对此感到好奇。

谢谢!

2 个答案:

答案 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);
}

效果很好。

希望这有助于某人。