【问题标题】:ImageView emptied on subsequent activity launchesImageView 在后续活动启动时清空
【发布时间】:2016-04-18 22:08:23
【问题描述】:

我正在使用此 AsyncTask 从 URL 加载图像并使用该图像填充 ImageView:

new DownloadImageTask((ImageView) findViewById(R.id.headerIV)).execute(imageURL);

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {

    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    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);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon11;
    }

    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }
}

我注意到,每当我在后台运行应用程序并重新启动 Activity 时,ImageView 都会被清空。对 ImageViews 的各种检查表明它们在 onCreate() 中为空,因此如果我想再次显示图像,我必须再次调用 AsyncTask,这最终会导致内存不足异常。所以,我想知道:该活动是否基于我正在使用的代码块在onPause() 上因某些原因回收/清空我的 ImageViews?

【问题讨论】:

  • 您需要了解活动生命周期。您最好使用 Glide、Picasso 等图像加载库来为您加载。
  • 你应该使用 Picasso 从 url 下载图片

标签: android android-asynctask imageview


【解决方案1】:

试试这个!!!!

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {

ImageView bmImage;
Bitmap mIcon11;

public DownloadImageTask(ImageView bmImage) {
    this.bmImage = bmImage;
}

protected Bitmap doInBackground(String... urls) {


    try {
            mIcon11 = BitmapFactory.decodeStream((InputStream) new URL(urls[0]).getContent());

        } catch (Exception e) {
            e.printStackTrace();
        }
    return mIcon11;
}

protected void onPostExecute(Bitmap result) {
    if (result != null) {
            bmImage.setImageBitmap(result);

        } else {

            Toast.makeText(TestActivity.this, "Image Does Not exist or Network Error", Toast.LENGTH_SHORT).show();

        }
}
} 

【讨论】:

    【解决方案2】:

    每当您的应用程序进入前台时,都会调用 onResume() 并再次生成视图,因此这可能是 null 值的原因。 你可以使用 onResume() 来做同样的事情。 (有关更多信息,请查看活动生命周期) 同样根据其他人的建议,您可以轻松使用 Picasso 或 Universal Image Loader 或其他库。 首先,您可以参考以下链接:

    https://www.simplifiedcoding.net/picasso-android-tutorial-picasso-image-loader-library/ http://javatechig.com/android/how-to-use-picasso-library-in-android http://javatechig.com/android/universal-image-loader-library-in-android

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2011-12-09
      • 2020-02-23
      相关资源
      最近更新 更多