Java 通过URL获取图像的问题

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

我在我的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.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);