java - 通过 URL 获取图像的问题

标签 java android-studio

我在我的 RPi 上托管一个网络服务,我有一个 .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 事件中),我将图像显示到 ImageView :

Button picturebutton = (Button) findViewById(R.id.btngetpic);
    final ImageView myview = (ImageView) findViewById(R.id.imgview1);

    assert picturebutton != null;
    picturebutton.setOnClickListener(
            new Button.OnClickListener() {
                public void onClick(View v) {
                    TextView mytext = (TextView) findViewById(R.id.mytext);
                    mytext.setText("done");
                    myview.setImageBitmap(getBitmapFromURL("http://169.254.XXX.XXX/Images/Itworks.png"));
                }
            }
    );

我的使用 list 中有互联网,但每当我运行应用程序时,它就会强制关闭。我有一种感觉,这与我的听众有关,但我无法修复它。任何帮助表示赞赏,因为我非常困惑。 (尽管我有 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.727 1283-3180/? W/ActivityManager:强制完成 Activity com.example.neil.access_control/.MainActivity

最佳答案

您的问题是:NetworkOnMainThreadException,您可以 read the documentation here ,但重要的是 Android 不能在主线程(图形用户界面)上进行“阻塞操作”。

使用 AsynkTask 或另一个线程来查询互联网/网络中的数据。

虽然 Picasso 是一个很好的“图像库”,但我也强烈推荐 Volley(来自 Google),它有一个优秀的文档,以及几个示例。不仅如此,Volley 还将“微观管理”最好的库以使用设备上可用的网络)。

请注意,API 19 KitKat 上的 IIRC 已弃用 HttpURLConnection

关于java - 通过 URL 获取图像的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38356939/

相关文章:

Java机器人无法控制整个键盘

java结果集覆盖

java - ActionListener 和 Thread.sleep

android - 复制资源/android/icon/mdpi-foreground.png 时出错

android - android studio中的NoClassDefFoundError异常

java - Android,不生成ActionBar

java - 重叠正则表达式第二部分

java - 以秒为单位获取当前时间并将其保存为整数

android - 找不到Android Studio 4.0.1默认 Activity

java - 如何将保存的 .wav 文件读取为字节或 double 组?我正在使用 Java/Android Studio