【问题标题】:Handling Loading Images From URL处理从 URL 加载图像
【发布时间】:2011-12-18 16:58:18
【问题描述】:

我有这段代码可以从 url 中提取图像并将其显示在应用程序中。

    Drawable drawableTest = LoadImageFromWeb("http://www.someimageurl");
    imgView.setImageDrawable(drawableTest);

private Drawable LoadImageFromWeb(String url){
    try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
    }catch (Exception e) {
        System.out.println("Exc="+e);
        return null;
    }
 }

该方法有效,图像被拉入应用程序没有问题。我想做的是两件事......

1) 将进程移至后台线程。

2) 在下载图像时显示“正在加载”的可绘制对象(位于可绘制文件夹中),然后在完成后切换到图像。如果有问题我想加载一个“无法加载图像”drawable(也位于drawable文件夹中)。

有人可以帮忙修改上面的方法,让它在后台运行,并在加载时显示适当的图像,如果有问题?

谢谢!顺便说一句,你们摇滚。

香农

【问题讨论】:

标签: android image drawable


【解决方案1】:

您可以使用AsyncTask 在另一个线程中运行任务。这样,它就不会阻塞 UI。大致应该是这样的:

private class MyTask extends AsyncTask<String, Void, Drawable> {

     ProgressDialog pd;

     protected Drawable doInBackground(String... url) {
            try {
                pd = ProgressDialog.show(this, "Working..", "Getting image", true, false);
                InputStream is = (InputStream) new URL(url[0]).getContent();
                Drawable d = Drawable.createFromStream(is, "src name");
                return d;
            } catch (Exception e) {
                System.out.println("Exception = " + e);
                return null;
            }
     }

     protected void onProgressUpdate(Void... progress) {
     }

     protected void onPostExecute(Drawable result) {
         /* Image loaded...*/
         pd.dismiss();
         imgView.setImageDrawable(result);

     }
}

MyTask task = new MyTask();
task.execute("http://www.someimageurl");

您可以随意更改ProgressDialog...

【讨论】:

  • 这看起来很棒,而且我正在寻找工作。我知道你说得粗略,所以我怀疑它不完整。我尝试实现,但遇到各种错误.. 截图错误 1)screencast.com/t/bqowMMfTu0WG,错误 2)screencast.com/t/NAEFwjNe4qa 错误 3)screencast.com/t/3AujxtIY 错误 4)screencast.com/t/98hg9qJbRqS 有什么想法吗?再次感谢 LAS_VEGAS!感谢您的帮助。
  • 要修复 #2,您需要将“this”替换为“context”
  • 要修复 #3 和 4,您需要将代码 MyTask task = new MyTask(); task.execute("http://www.someimageurl"); 放入方法中!
  • 大声笑...是的,我也想通了!我的错。
  • 知道了!刚刚注意到你的更正。 :-) 你太棒了!
【解决方案2】:

试试这个代码...

         Drawable d;
    LoadImageFromWebThread loadImageFromWebThread=new                                     LoadImageFromWebThread(url);
    loadImageFromWebThread.start();
    imgView.setImageDrawable(R.drawable.downloaded);


   class LoadImageFromWebThread extends Thread
   {
       String url; 
       public LoadImageFromWebThread(String url)
       {
           this.url=url;
       }
       @Override
    public void run() {
        // TODO Auto-generated method stub

           try {
                InputStream is = (InputStream) new URL(url).getContent();
                 d = Drawable.createFromStream(is, "src name");
               handler.sendEmptyMessage(0);
            }catch (Exception e) {
                System.out.println("Exc="+e);
                handler.sendEmptyMessage(1);
            }
    }

   }

   final Handler handler = new Handler() {
        public void handleMessage(Message msg) {

            if(msg.what==0)
            {
                imgView.setImageDrawable(d);
            }
            else
            {
                //Error in downloading image
            }
        }
    };

【讨论】:

    【解决方案3】:

    我知道我在这个讨论中来晚了,但我想分享我发现的从给定 url 异步加载图像的最佳方法。 我正在使用一个名为Android Query 的android 库。 要使用 Android 查询轻松加载图像,请执行以下操作:

        // Init Android Query
        AQuery aq = new AQuery(this);
        //fetch and set the image from internet, cache with file and memory 
        aq.id(R.id.image1).image(url);
    

    希望这会对某人有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多