Java 通过URL获取图像的问题
我在我的RPi上托管一个Web服务,我有一个.png图像,我可以从我的android设备通过网络访问它。这是我获取该图像的代码:Java 通过URL获取图像的问题,java,android-studio,Java,Android Studio,我在我的RPi上托管一个Web服务,我有一个.png图像,我可以从我的android设备通过网络访问它。这是我获取该图像的代码: // Write image to image view public static Bitmap getBitmapFromURL(String src) { try { URL url = new URL(src); HttpURLConnection connection = (HttpURLConnection) url
// Write image to image view
public static Bitmap getBitmapFromURL(String src) {
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
return BitmapFactory.decodeStream(input);
} catch (IOException e) {
e.getMessage();
return null;
}
}
在这里,当单击按钮时(在Oncreate事件中),我将图像显示到图像视图:
我的使用清单中有INTERNET,但每当我运行应用程序时,它都会强制关闭。我觉得这和我的听众有关,但我无法解决。感谢您的帮助,因为我非常困惑。(虽然我有java桌面的经验,但我对Android开发还是新手)
编辑:强制关闭的异常堆栈
07-13 18:14:00.718 4077-4077/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.neil.access_control, PID: 4077
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
at libcore.io.IoBridge.connect(IoBridge.java:122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)
at java.net.Socket.connect(Socket.java:884)
at com.android.okhttp.internal.Platform.connectSocket(Platform.java:117)
at com.android.okhttp.internal.http.SocketConnector.connectRawSocket(SocketConnector.java:160)
at com.android.okhttp.internal.http.SocketConnector.connectCleartext(SocketConnector.java:67)
at com.android.okhttp.Connection.connect(Connection.java:152)
at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:185)
at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:341)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
at com.example.neil.access_control.MainActivity.getBitmapFromURL(MainActivity.java:71)
at com.example.neil.access_control.MainActivity$1.onClick(MainActivity.java:54)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-13 18:14:00.7271283-3180/?W/ActivityManager:Force finishing activity com.example.neil.access_control/.main activity我知道这是解决您问题的“替代”解决方案,但我想发布它,因为当我遇到它试图解决我的一系列问题时,它也对我有帮助 我建议您使用作为图像加载器,因为它可以从URL加载图像,并为您提供:
- 缓存机制
- 图像转换实用程序
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
另一方面,要仅加载位图,可以执行以下操作(如中所述):
注意:我与毕加索没有任何关系,我知道这是解决您问题的“替代”解决方案,但我想发布它,因为当我遇到它试图解决我的一系列问题时,它也对我有帮助 我建议您使用作为图像加载器,因为它可以从URL加载图像,并为您提供:
- 缓存机制
- 图像转换实用程序
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
另一方面,要仅加载位图,可以执行以下操作(如中所述):
注意:我与毕加索没有任何关系,你的问题是:
NetworkOnMainThreadException
,你可以,但重要的是Android不能在主线程(图形用户界面)上有“阻塞操作”
使用AsynkTask或其他线程查询internet/网络中的数据
虽然毕加索是一个很好的“图像库”,但我也强烈建议截取(来自谷歌),它有一个优秀的文档,以及几个例子。不仅如此,Volley还将“微观管理”使用设备上可用网络的最佳库)
请注意,HttpURLConnection在API 19 KitKat上不推荐使用IIRC。您的问题是:
NetworkOnMainThreadException
,您可以,但重要的是Android不能在主线程(图形用户界面)上进行“阻塞操作”
使用AsynkTask或其他线程查询internet/网络中的数据
虽然毕加索是一个很好的“图像库”,但我也强烈建议截取(来自谷歌),它有一个优秀的文档,以及几个例子。不仅如此,Volley还将“微观管理”使用设备上可用网络的最佳库)
请注意,HttpURLConnection在API 19 KitKat上不推荐使用IIRC,如果您可以粘贴异常堆栈,这会有所帮助。你有权访问日志吗?看看这个答案,特别是Arshad Ali的答案。如果你能粘贴异常堆栈,那会很有帮助。你有权访问日志吗?看看这个答案,特别是Arshad Ali的答案。那么我的GetBitmapfromUrl方法应该在AsyncTask线程中执行吗?您建议用什么代替HttpURLConnection?提前感谢
所以我的GetBitmapfromUrl方法应该在AsyncTask线程内执行代码>是您建议用什么替代HttpURLConnection?
如果这是一个学习应用程序,请继续使用HttpURLConnection。如果你打算创造一个产品,那么请,我一直在使用它,并对结果非常满意。它的速度快,可以处理很多情况,做缓存等最后的说明。我相信这是在AsyncTask线程中执行GetBitmapfromUrl方法的最佳开端?您建议用什么代替HttpURLConnection?提前感谢所以我的GetBitmapfromUrl方法应该在AsyncTask线程内执行代码>是您建议用什么替代HttpURLConnection?
如果这是一个学习应用程序,请继续使用HttpURLConnection。如果你打算创造一个产品,那么请,我一直在使用它,并对结果非常满意。它的速度快,可以处理很多情况,做缓存等最后的说明。我相信这是最好的开始
Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
/* Do something with the bitmap*/
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
/* handle failure */
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
/* you may execute some logic before loading*/
}
};
Picasso.with(context).load(imageURL).into(target);