【问题标题】:Loading images in ImageView from a url [duplicate]从 URL 加载 ImageView 中的图像 [重复]
【发布时间】:2015-07-03 11:46:12
【问题描述】:

我在网上找到了这个sn-p:

try{
        URL url = new URL(imgUrl+imageId[position]+".png");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        InputStream is = con.getInputStream();
        Bitmap bmp = BitmapFactory.decodeStream(is);
        imageView.setImageBitmap(bmp);
    }catch(Exception e) {
        System.out.println(e.getMessage());
    }

代码没有给我任何错误,我得到了我想要的确切网址。但是 ImageView 保持为空。运行调试器我没有问题:InputStream is = con.getInputStream(); 在此之后,调试器转到 catch 块,调试器窗口显示

NetworkOnMainThreadException

我知道这是因为我在 UI 线程上进行网络操作,但我的活动已经在扩展另一个类,所以我无法扩展 AsycnTask。有什么解决方法吗?

另外:如果出现异常,应用程序不应该崩溃吗?我的应用程序运行良好,但 imageview 没有显示任何内容。

【问题讨论】:

  • 开始使用毕加索。
  • 试试这个 Android :使用 Asynctask 从 Web 加载图像stackoverflow.com/a/3090802/4826114
  • 你的类不需要扩展 AsyncTask,创建一个扩展 AyncTask<...> 的类来编写你的代码。

标签: android imageview


【解决方案1】:

您可以在异步线程中使用 Picasso 来帮助您:

Picasso.with(context).load(imgUrl+imageId[position]+".png").into(imageView);

您可以在这里下载源代码:http://square.github.io/picasso/ 或直接从 Android Studio 将其添加为依赖项

【讨论】:

  • 这行代码会确保图片加载在单独的线程中完成吗?
  • 是的,毕加索处理所有后台线程
  • @AmanGrover 绝对是的。
  • 是的。 Picasso 在单独的线程中为您处理图像加载并调整结果大小(以摆脱 OutOfMemory 异常)然后将位图设置为 UIThread 上的 ImageView
【解决方案2】:

较新版本的 Android 要求您在单独的线程上发出 HTTP 请求(网络)。您可以创建一个单独的线程,或为此使用 AsyncTask。执行此操作后,相同的代码应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多