Android 如何从URL获取要加载的图像?(关于SO的所有答案不起作用/已弃用)
我正在尝试建立一个应用程序,我想在其中显示一些图像 在实际开始之前,我已经有一个问题: 我无法让imageview从URL加载图像 我知道这是本主题中最常见的问题之一,下面是我从中摘取的一些代码: 以下是我的全部主要活动: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
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;
}
}
我建议使用以下库,它可以处理图像加载/缓存等更多问题,它只会让您的生活更轻松;-) 特点:
- 简单的
- 内存和文件缓存
- 下采样
- 可缩放(网络视图)
- 回退映像
- 预压
- 动画
- 动态纵横比
- 避免重复的同时抓取
- 自定义回调
- 简单的
- 内存和文件缓存
- 下采样
- 可缩放(网络视图)
- 回退映像
- 预压
- 动画
- 动态纵横比
- 避免重复的同时抓取
- 自定义回调
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。。。我正在研究毕加索——你能帮我解决这个问题吗(查看关于“塔索马尼亚克”答案的评论。谢谢!