【问题标题】:How do I programmatically add images to my android app如何以编程方式将图像添加到我的 android 应用程序
【发布时间】:2014-07-16 18:26:46
【问题描述】:

我希望能够使用 url 作为图像源。我找到了以下转换为位图的函数。但是,我得到一个“NetworkOnMainThreadException”。使用日志我发现

conn.connect();

,是函数崩溃的地方。

我还发现由于异常我应该使用 AsyncTask 类扩展。所以我在下面的第二段代码中使用了它。我仍然以同样的例外告终。我不完全理解错误的含义,只是我试图同时在同一个地方做太多事情。

有没有更简单的方法可以将网址转换为我可以使用的图片?如何修复我现在拥有的功能?

 public static Bitmap getImageBitmap(String url) {
            Log.i("bitmap","here?");
            Bitmap bm = null;
            Log.i("bitmap","here?");
            try {
                Log.i("bitmap","here?");
                URL aURL = new URL(url);
                Log.i("bitmap","here?");
                URLConnection conn = aURL.openConnection();
                Log.i("bitmap","last ?");
                conn.connect();
                Log.i("bitmap","here?");
                InputStream is = conn.getInputStream();
                Log.i("bitmap","here?");
                BufferedInputStream bis = new BufferedInputStream(is);
                Log.i("bitmap","here?");
                bm = BitmapFactory.decodeStream(bis);
                bis.close();
                Log.i("bitmap","here?");
                is.close();
                Log.i("bitmap","here?");
           } catch (IOException e) {
               Log.e("img", "Error getting bitmap", e);
           }
           return bm;
        }   

使用异步任务:

class taskRunner extends AsyncTask<String, URL, Bitmap>{

     public static Bitmap getImageBitmap(String url) {
            Log.i("bitmap","here?");
            Bitmap bm = null;
            Log.i("bitmap","here?");
            try {
                Log.i("bitmap","here?");
                URL aURL = new URL(url);
                Log.i("bitmap","here?");
                URLConnection conn = aURL.openConnection();
                Log.i("bitmap","last ?");
                conn.connect();
                Log.i("bitmap","here?");
                InputStream is = conn.getInputStream();
                Log.i("bitmap","here?");
                BufferedInputStream bis = new BufferedInputStream(is);
                Log.i("bitmap","here?");
                bm = BitmapFactory.decodeStream(bis);
                bis.close();
                Log.i("bitmap","here?");
                is.close();
                Log.i("bitmap","here?");
           } catch (IOException e) {
               Log.e("img", "Error getting bitmap", e);
           }
           return bm;
        }   

非常感谢您抽出宝贵时间阅读本文。

【问题讨论】:

  • 这不是重复的 - 发帖人知道这个问题,但即使 参考该答案后解决它也有问题。但是当前问题的问题是没有堆栈跟踪来显示当前发生异常的哪里 - 找到它将是修复它的关键。

标签: java android image url


【解决方案1】:

首先,不要忘记清单中的互联网权限

<uses-permission android:name="android.permission.INTERNET"/>

其次是你的实现错误..

class BitmapTaks extends AsyncTask<ImageView, Void, Bitmap> {

protected Bitmap doInBackground(ImageView... imageview) {
   Log.i("bitmap","here?");
        Bitmap bm = null;
        Log.i("bitmap","here?");
        try {
            Log.i("bitmap","here?");
            URL aURL = new URL(urls[0]);
            Log.i("bitmap","here?");
            URLConnection conn = aURL.openConnection();
            Log.i("bitmap","last ?");
            conn.connect();
            Log.i("bitmap","here?");
            InputStream is = conn.getInputStream();
            Log.i("bitmap","here?");
            BufferedInputStream bis = new BufferedInputStream(is);
            Log.i("bitmap","here?");
            bm = BitmapFactory.decodeStream(bis);
            bis.close();
            Log.i("bitmap","here?");
            is.close();
            Log.i("bitmap","here?");
       } catch (IOException e) {
           Log.e("img", "Error getting bitmap", e);
       }
       return bm;
}

protected void onPostExecute(Bitmap b) {
   //do something after execute
}
}

调用方式是:

new BitmapTaks().execute(url);

应该是这样的,希望对你有帮助

编辑:

AsyncTask - 这是异步结构..

在这种情况下,参数是 ImageView,并且您还想为 url 传递字符串。 结果将是位图,并将在 OnPostExecute 方法上设置。

我把上面的例子写下来以便理解..你可以看下一个链接:http://chrisharrington1.wordpress.com/2012/01/24/android-setting-a-downloaded-image-to-an-imageview/

如果你还需要什么,请告诉我

【讨论】:

  • 函数没有返回位图。它的返回类型是。当我尝试将其分配给位图变量时,我被告知存在不匹配。当我按照上面的指示执行函数时,它不会崩溃,但是如何将位图放入我的变量并将其设置为我的 imageView?
  • android.os.AsyncTask 这是来自android doc,所以你错了,它返回Bitmap,你在onPostExecute方法上得到它。您需要了解 AsyncTask 的含义.. 我会更新我的答案
  • 我对 AsyncTask 进行了一些研究,并且我有更好的理解,但我不知道如何将位图设置为我的图像。我可以在 AsyncTask 中引用我在循环中创建的图像吗?我可以从 AsyncTask 中返回我的位图,然后将其设置为我的图像吗?
  • 我正在根据服务器上的 xml 文件创建具有不同数量图像的行,如果该信息有帮助的话。
  • 您可以将所需的处理程序和全局 List 传递给 AsyncTask .. 选项很少。看看这个线程上的答案:stackoverflow.com/questions/3090650/… 或者这个线程:stackoverflow.com/questions/7729133/…
猜你喜欢
  • 2017-06-07
  • 2021-01-22
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
相关资源
最近更新 更多