首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从URL抓取图片

从URL抓取图片
EN

Stack Overflow用户
提问于 2012-09-04 20:43:21
回答 3查看 382关注 0票数 0

我只是想从URL中获取一个图像,并将其显示在图像视图中。

代码:

代码语言:javascript
复制
public class MainActivity extends Activity {

    // declare internal using controls
    private TextView txtUrl;
    private ImageView imgView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imgView =(ImageView)findViewById(R.id.imageView1);

        Drawable drawable=null;


            drawable = grabImageFromUrl("http://blog.sptechnolab.com/wp-content/uploads/2011/02/c2.jpg");
            imgView.setImageDrawable(drawable);

    }



    private Drawable grabImageFromUrl(String url)  {
        try {
            return Drawable.createFromStream((InputStream)new URL(url).getContent(), "src");
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

我有一个错误:

代码语言:javascript
复制
09-04 20:34:18.712: E/AndroidRuntime(1156): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: android.os.NetworkOnMainThreadException

,我很感谢你的帮助,请在你的回答中具体点,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-04 20:47:59

您的应用程序是否配置了Internet权限?也就是说,您的应用程序清单中有以下内容吗?

代码语言:javascript
复制
    <uses-permission android:name="android.permission.INTERNET" />

跟进:同样,错误似乎是说你不应该在你的应用程序的UI线程上进行网络访问。在应用程序的UI线程上做任何长时间的阻塞I\O通常是一种糟糕的做法。尝试使用AnycTask,或者您甚至可以查看LazyList中的一些代码。

示例:将其作为内部类添加到您的活动中:

代码语言:javascript
复制
private class DownloadTask extends AsyncTask<Void, Void, Drawable>{

    private final String mUrl;
    public DownloadTask(String url){
        mUrl = url;
    }

    @Override
    protected Drawable doInBackground(Void... params) {
        try {
            return Drawable.createFromStream((InputStream)new URL(mUrl).getContent(), "src");
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    protected void onPostExecute(Drawable result){
        ((ImageView)findViewById(R.id.imageView1)).setImageDrawable(result);
    }

}

然后从你的onCreate中这样称呼它:

代码语言:javascript
复制
new DownloadTask(url).execute();
票数 3
EN

Stack Overflow用户

发布于 2012-09-04 20:46:29

还可以在堆栈中查看这个问题:

显示URL大小和屏幕方向问题的图像

可能会有帮助的。

票数 0
EN

Stack Overflow用户

发布于 2012-09-04 21:12:27

简单的方法是简单地使用setImageURI

代码语言:javascript
复制
imgView = (ImageView)findViewById(R.id.imageView1);
imgView.setImageURI(Uri.parse("http://blog.sptechnolab.com/wp-content/uploads/2011/02/c2.jpg"));

然而,正如在文档中所指出的:

这会在UI线程上进行位图读取和解码,这可能会导致延迟打嗝。

如果这是个问题,您可能想要像另一个答案所建议的那样在AsyncTask中解码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12271079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档