Android 如何从URL获取要加载的图像?(关于SO的所有答案不起作用/已弃用)

Android 如何从URL获取要加载的图像?(关于SO的所有答案不起作用/已弃用),android,image,url,web,Android,Image,Url,Web,我正在尝试建立一个应用程序,我想在其中显示一些图像 在实际开始之前,我已经有一个问题: 我无法让imageview从URL加载图像 我知道这是本主题中最常见的问题之一,下面是我从中摘取的一些代码: 以下是我的全部主要活动: public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate

我正在尝试建立一个应用程序,我想在其中显示一些图像

在实际开始之前,我已经有一个问题: 我无法让imageview从URL加载图像

我知道这是本主题中最常见的问题之一,下面是我从中摘取的一些代码:

以下是我的全部主要活动:

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Bitmap bitmap = DownloadImage("http://4.bp.blogspot.com/-w7q2YocdYpY/UCeb6SCfGoI/AAAAAAAAAWY/nsXfzrGQjyA/s1600/Yahoo+Messenger.png");
        ImageView img = (ImageView) findViewById(R.id.imageView1);
        img.setImageBitmap(bitmap);
    }

    private InputStream OpenHttpConnection(String urlString) throws IOException {
        InputStream in = null;
        int response = -1;

        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();

        if (!(conn instanceof HttpURLConnection))
            throw new IOException("Not an HTTP connection");

        try {
            HttpURLConnection httpConn = (HttpURLConnection) conn;
            httpConn.setAllowUserInteraction(false);
            httpConn.setInstanceFollowRedirects(true);
            httpConn.setRequestMethod("GET");
            httpConn.connect();
            response = httpConn.getResponseCode();
            if (response == HttpURLConnection.HTTP_OK) {
                in = httpConn.getInputStream();
            }
        } catch (Exception ex) {
            throw new IOException("Error connecting");
        }
        return in;
    }

    private Bitmap DownloadImage(String URL) {
        Bitmap bitmap = null;
        InputStream in = null;
        try {
            in = OpenHttpConnection(URL);
            bitmap = BitmapFactory.decodeStream(in);
            in.close();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        return bitmap;
    }
    
 
}
我有:

 <uses-permission android:name="android.permission.INTERNET" />
大型Logcat错误,应用程序在启动时崩溃

08-19 00:29:56.970: E/AndroidRuntime(4731): FATAL EXCEPTION: main
08-19 00:29:56.970: E/AndroidRuntime(4731): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.exampl.aaa/com.exampl.aaa.MainActivity}: java.lang.IllegalArgumentException: Target must not be null.
08-19 00:29:56.970: E/AndroidRuntime(4731):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2077)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at android.app.ActivityThread.access$600(ActivityThread.java:134)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at android.os.Looper.loop(Looper.java:154)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at android.app.ActivityThread.main(ActivityThread.java:4624)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at java.lang.reflect.Method.invokeNative(Native Method)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at java.lang.reflect.Method.invoke(Method.java:511)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at dalvik.system.NativeStart.main(Native Method)
08-19 00:29:56.970: E/AndroidRuntime(4731): Caused by: java.lang.IllegalArgumentException: Target must not be null.
08-19 00:29:56.970: E/AndroidRuntime(4731):     at com.squareup.picasso.RequestBuilder.into(RequestBuilder.java:317)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at com.exampl.aaa.MainActivity.onCreate(MainActivity.java:33)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at android.app.Activity.performCreate(Activity.java:4479)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
08-19 00:29:56.970: E/AndroidRuntime(4731):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
08-19 00:29:56.970: E/AndroidRuntime(4731):     ... 11 more
什么目标不能为空? ... 请帮忙:)

EDIT2 忘记上一次编辑。 我没有 setContentView(R.layout.main)

-.-。。。。另一方面,塔索马尼亚克的回答很有效:只是加了毕加索的罐子:

 ImageView imgView =(ImageView)findViewById(R.id.imageView1);

Picasso.with(this).load("http://i.imgur.com/DvpvklR.png").into(imgView);
不需要异步任务或复杂的废话


谢谢大家!

使用来自Square Inc.的毕加索图书馆。它需要以下1行代码,仅此而已

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

使用来自Square Inc.的毕加索图书馆。它需要以下1行代码,仅此而已

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

我也有此权限,不确定是否有必要,但值得一试:

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

我也有这个许可,不确定是否有必要,但值得一试:

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

不使用第三方库,您可以执行以下操作:

private Bitmap getBitmap(String url) {
            try{
                HttpURLConnection con = (HttpURLConnection)new URL(url).openConnection();
                con.setDoInput(true);
                con.connect();
                InputStream input = con.getInputStream();
                Bitmap bmp = BitmapFactory.decodeStream(input);
                input.close();
                return bmp;
            }catch(Exception e){
                Log.v("SHOW", e.getMessage());
                return null;
            }
        }

不使用第三方库,您可以执行以下操作:

private Bitmap getBitmap(String url) {
            try{
                HttpURLConnection con = (HttpURLConnection)new URL(url).openConnection();
                con.setDoInput(true);
                con.connect();
                InputStream input = con.getInputStream();
                Bitmap bmp = BitmapFactory.decodeStream(input);
                input.close();
                return bmp;
            }catch(Exception e){
                Log.v("SHOW", e.getMessage());
                return null;
            }
        }

我建议使用以下库,它可以处理图像加载/缓存等更多问题,它只会让您的生活更轻松;-)

特点:

  • 简单的
  • 内存和文件缓存
  • 下采样
  • 可缩放(网络视图)
  • 回退映像
  • 预压
  • 动画
  • 动态纵横比
  • 避免重复的同时抓取
  • 自定义回调

我建议使用以下库,它可以处理图像加载/缓存等更多问题,它只会让您的生活更轻松;-)

特点:

  • 简单的
  • 内存和文件缓存
  • 下采样
  • 可缩放(网络视图)
  • 回退映像
  • 预压
  • 动画
  • 动态纵横比
  • 避免重复的同时抓取
  • 自定义回调


现有数十个用于此目的的库。我喜欢和,但还有很多其他选择。谢谢你的帮助!,我肯定会研究这些:-)SLaks是一个很好的观点,你是否得到了NetworkOnMainThreadException,因为看起来你就是这么做的。如果是这样,您将需要在AsyncTask或ServiceHmmm中执行此操作。。。我正在研究毕加索-你能帮我解决这个问题吗(查看关于“tasomaniac”答案的评论。谢谢!听起来你试图在错误的部分初始化imgView。你正在调用setContentView(R.layout.YOUR_layout);在作业之前?有几十个现有的库可供选择。我喜欢和,但还有很多其他库可供选择。谢谢你的帮助!我一定会研究这些:-)SLaks很有意义,你是否得到了NetworkMainThreadException,因为看起来你就是这么做的。如果是这样,您将需要在AsyncTask或ServiceHmmm中执行此操作。。。我正在调查毕加索-你能帮我解决这个问题吗(查看“tasomaniac”答案的评论。谢谢!听起来你试图在错误的部分初始化imgView。你是否调用setContentView(R.layout.YOUR_layout);在作业之前?“上下文无法解析为变量”…我已经将jar添加到了libs文件夹中,但是如何准确设置此上下文变量?(我应该将其初始化为什么?)@user2678122:
context
这里可能是您的
活动
.private静态上下文;(在OnCreate中)context=getApplicationContext()------这会使应用程序在启动时崩溃。嗯…还有什么吗?在您的活动中,您可以使用“This”作为您的上下文oh,lol。但它仍然不起作用。我已使用logcat输出更新了答案。请参阅。“上下文无法解析为变量”…我已经将jar添加到了libs文件夹中,但是如何准确设置此上下文变量?(我应该将其初始化为什么?)@user2678122:
context
这里可能是您的
活动
.private静态上下文;(在OnCreate中)context=getApplicationContext()------这会使应用程序在启动时崩溃。嗯……还有什么吗?在活动中,您可以使用“This”作为你的上下文哦,哈哈。但它仍然不起作用。我已经用logcat输出更新了答案。请看。好吧,如果我不在UI线程上做它,那就好了。好吧,如果我不在UI线程上做它,那就好了,看起来就是OP在做的。@SLaks使用
异步任务
,没有问题s:)真不敢相信,这一切仅仅是为了加载一个图像…:/呵呵,我实际上有3个应用程序在市场上,只是从来没有需要使用图像XD。。。我正在研究毕加索-你能帮我解决这个问题吗(查看“tasomaniac”答案的评论。谢谢!@SLaks使用
异步任务
,没有问题:)难以置信,所有这些都只是为了加载一个图像…:/呵呵,我实际上有3个应用程序在市场上,只是从来没有需要使用图像XD。。。我正在研究毕加索——你能帮我解决这个问题吗(查看关于“塔索马尼亚克”答案的评论。谢谢!