0

我只是想从 URL 中抓取图像并将其显示在图像视图中

编码:

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

感谢您的帮助,请在您的回答中具体说明

4

3 回答 3

3

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

    <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();
于 2012-09-04T20:47:59.790 回答
0

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

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

正如文档中所述:

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

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

于 2012-09-04T21:12:27.950 回答
0

也看看堆栈中的这个问题:

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

这可能会有所帮助。

于 2012-09-04T20:46:29.080 回答