1

我有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.- 我再次滑动到第三个片段。7. 第三个片段。8.我回到第一个片段,图像不再加载。显然我不会再次调用 DownloadImageTask,因为它会降低很多用户体验。

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

哦,顺便说一句。如果我只是从第 1 次滑动到第 2 次,则图像不会“卸载”,如果我转到第 3 次或更远,就会发生这种情况。知道为什么会这样吗?我只是对此感到好奇。

谢谢!

4

2 回答 2

1

使用 LruCache 创建位图的 RAM 缓存。

这个很棒的 Google IO 演讲准确地解释了如何使用它:http: //youtu.be/gbQb1PVjfqM ?t=5m

于 2013-01-11T13:57:13.833 回答
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;
}

执行后:

protected void onPostExecute(Bitmap result) {
    frag.update(result);
}

它完美地工作。

希望这可以帮助某人。

于 2013-01-13T16:11:31.590 回答