Android 如何保存以前加载的图像?

Android 如何保存以前加载的图像?,android,android-image,Android,Android Image,我有3个碎片。这些片段被放置在一个选项卡中,以便在这些片段之间切换 问题在于,当应用程序加载并创建片段视图时,它会下载图像,然后更改图像视图: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.myFragmentView = inflater.inflate(R.layout.foto_setmana, co

我有3个碎片。这些片段被放置在一个选项卡中,以便在这些片段之间切换

问题在于,当应用程序加载并创建片段视图时,它会下载图像,然后更改图像视图:

@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");
    }
}
下载图像任务中的代码:

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);
}
公共类下载ImageTask扩展异步任务{
查看myfragmentview;
公共下载ImageTask(查看myfragmentview){
this.myfragmentview=myfragmentview;
}
受保护位图doInBackground(字符串…URL){
字符串urldisplay=url[0];
位图mIcon11=null;
试一试{
InputStream in=newjava.net.URL(urldisplay.openStream();
mIcon11=BitmapFactory.decodeStream(in);
Log.d(“调试”,“mIcon11”+mIcon11.getHeight());
}捕获(例外e){
Log.e(“Error”,e.getMessage());
e、 printStackTrace();
}
返回mIcon11;
}
受保护的void onPostExecute(位图结果){
ImageView imv=(ImageView)this.myfragmentview.findViewById(R.id.imageView1);
imv.setImageBitmap(结果);
}
这就是正在发生的事情:

1.-我点击应用程序 2.-应用程序加载。此屏幕是在应用程序有时间检索图像之前拍摄的。 3.-当它检索图像时,它会显示。 -我把碎片扫到下一个。 5.-第二个片段 -我再次刷到第三个碎片。 7.第三段。 8.我回到第一个片段,图像不再加载。显然,我不会再次调用DownloadImageTask,因为这会降低用户体验

我应该如何保存图像?

哦,顺便说一句。如果我只是从1号扫到2号,图像不是“卸载”的,如果我再扫到3号或更远的地方,就会发生。你知道为什么会发生这种情况吗?我只是好奇而已


谢谢!

使用LruCache创建位图的RAM缓存

这篇精彩的Google IO演讲准确地解释了如何使用它:

使用LruCache创建位图的RAM缓存

这篇精彩的Google IO演讲准确地解释了如何使用它:

我找到了一种工作方式:

我们要做的是,在片段上创建一个变量,以了解我们是否下载了位图,并创建另一个变量来保存位图,如:

int downloaded;
Bitmap pictureSaved;
然后,我们根据片段在“onAttach”方法上初始化它

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.downloaded=0;
}
之后,在“主代码”上:

下载ImageTask代码,应该下载图像,如您所见,我将传递给他的构造函数“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像这样调用fragment的方法。 变量:

MyFragment frag;
建造商:

public DownloadImageTask(View myfragmentview, MyFragmentA parent) {
    this.myfragmentview=myfragmentview;
    this.frag=parent;
}
执行后:

protected void onPostExecute(Bitmap result) {
    frag.update(result);
}
它工作得很好


希望这对某人有所帮助。

我找到了一种方法,它可以工作:

我们要做的是,在片段上创建一个变量,以了解我们是否下载了位图,并创建另一个变量来保存位图,如:

int downloaded;
Bitmap pictureSaved;
然后,我们根据片段在“onAttach”方法上初始化它

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.downloaded=0;
}
之后,在“主代码”上:

下载ImageTask代码,应该下载图像,如您所见,我将传递给他的构造函数“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像这样调用fragment的方法。 变量:

MyFragment frag;
建造商:

public DownloadImageTask(View myfragmentview, MyFragmentA parent) {
    this.myfragmentview=myfragmentview;
    this.frag=parent;
}
执行后:

protected void onPostExecute(Bitmap result) {
    frag.update(result);
}
它工作得很好


希望这对其他人有所帮助。

文本和其他组件也可以缓存吗?我从未尝试过,但我看不出为什么不可以。只需要找到一种正确的方法来处理
sizeOf()
方法。重要提示:不要缓存任何包含上下文的内容,包括所有UI元素。你应该只缓存数据。好的。这个答案没问题,但LruCache有点难实现,因为你需要做一些数学运算。我找到了一个更清晰的方法。文本和其他组件也可以缓存吗?我从未尝试过,但我不明白为什么不可以t、 只需找到一种适当的方法来处理
sizeOf()
方法。重要提示:不要缓存任何包含上下文的内容,包括所有UI元素。你应该只缓存数据。好的。这个答案没问题,但LruCache有点难实现,因为你需要做一些数学运算。我找到了一个更清晰的方法。请注意,我们实际上应该做一些编码来检测错误,比如下载失败dn没有成功。请注意,我们实际上应该做一些编码来检测错误,比如下载没有成功。