从URL抓取图片

时间:2012-09-04 20:43:21

标签: android android-imageview

我只想从网址抓取图片并将其显示在图片视图中

代码:

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;
    }

}

我遇到此错误:

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

非常感谢您的帮助,请具体说明您的答案

3 个答案:

答案 0 :(得分:3)

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

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

关注:此外,错误似乎是说您不应该在应用的UI线程上进行网络访问。在应用程序的UI线程上执行任何长时间阻塞I \ O通常是一种不好的做法。尝试使用AnycTask,或者您甚至可以查看LazyList中的部分代码。

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

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中调用它:

new DownloadTask(url).execute();

答案 1 :(得分:0)

在堆栈中看一下这个问题:

Display image from URL - sizing and screen orientation problems

这可能会有所帮助。

答案 2 :(得分:0)

简单方法是使用setImageURI

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

正如文档中所述:

  

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

如果这是一个问题,您可能希望按照另一个答案的建议在AsyncTask中进行解码。