0

我在将图像从网络下载到我的 android 项目时遇到了一点问题。每次我尝试连接到互联网时,我的应用程序都会不断崩溃。
是的,我将权限添加到 Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my.app"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.INTERNET"/>

logCat 是这样说的:

06-02 12:15:36.520: E/AndroidRuntime(13947): FATAL EXCEPTION: main
06-02 12:15:36.520: E/AndroidRuntime(13947): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.app/com.my.app.MyAppActivity}: android.os.NetworkOnMainThreadException
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.os.Looper.loop(Looper.java:137)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.app.ActivityThread.main(ActivityThread.java:4424)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at java.lang.reflect.Method.invokeNative(Native Method)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at java.lang.reflect.Method.invoke(Method.java:511)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at dalvik.system.NativeStart.main(Native Method)
06-02 12:15:36.520: E/AndroidRuntime(13947): Caused by: android.os.NetworkOnMainThreadException
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at java.net.InetAddress.getAllByName(InetAddress.java:220)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at java.net.URLConnection.getContent(URLConnection.java:194)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at java.net.URL.getContent(URL.java:447)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at com.my.app.MyAppActivity.onCreate(MyAppActivity.java:25)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.app.Activity.performCreate(Activity.java:4465)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-02 12:15:36.520: E/AndroidRuntime(13947):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-02 12:15:36.520: E/AndroidRuntime(13947):    ... 11 more

现在花了将近一个小时试图找出问题所在....

4

6 回答 6

3

如果你在 onCreate() 中使用下载图片的方法,它将表现为一个同步操作——也就是说,在下载图片之前它不会返回控制——直接调用它会冻结你的 Activity 的 UI。这不是在 Android 3.0 及更高版本中允许;所有同步代码都必须使用 AsyncTask 类进行包装。使用 AsyncTask 使您能够在单独的线程中执行后台任务,然后在 UI 线程中返回结果。这样,您就可以执行后台操作,而无需处理复杂的线程问题。

要异步调用 DownloadImage() 方法,您需要将代码包装在 AsyncTask 类的子类中,如下所示:

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    protected Bitmap doInBackground(String... urls) {
        return DownloadImage(urls[0]);
    }
    protected void onPostExecute(Bitmap result) {
        ImageView img = (ImageView) findViewById(R.id.img);
        img.setImageBitmap(result);
    }
}
于 2015-01-16T11:06:46.343 回答
1

您必须使用AsyncTask 从服务器下载图像,因为您的主线程无法处理它。并且您正试图在主线程中下载图像。所以 NetworkOnMainThreadException 发生。所以在单独的线程中下载图像。

请参阅此示例

于 2012-06-02T10:22:48.087 回答
0

Please refer this answer

The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. See the document Designing for Responsiveness.

For more details please visit Android developer site

于 2012-06-02T11:28:50.743 回答
0

每个内容都必须在单独的线程上下载...您可以使用 AsyncTask、线程...

于 2012-06-02T10:24:50.380 回答
0

您应该为此使用异步任务,这是一种安全防护,因此您的主线程(ui thread)不会挂起。他们把它放在 3.0 或 3.1 中,我只是挖一个旧帖子给你一个例子

HTTP POST 请求 ANDROID 4(在 2.3 中工作)?

反对android并在主线程中进行联网将是非常糟糕的做法。他们这样做是有原因的,如果你不这样做,它很可能会fc。

于 2012-06-02T10:27:37.793 回答
0

创建响应式应用程序的一个好习惯是确保您的主 UI 线程执行最少的工作。任何可能挂起您的应用程序的潜在长任务都应在不同的线程(后台线程)中处理。当您在主线程上处理长时间操作时,您将失去 android 应用程序的响应能力,如果您将此类任务与网络操作一起使用,您将收到android.os.NetworkOnMainThreadException异常抛出给您。

此类任务的典型示例是网络操作,它涉及不可预测的延迟。用户会容忍一些暂停,特别是如果您提供反馈说某事正在进行中,但冻结的应用程序不会给他们任何线索。

本文中,我们将创建一个简单的图像下载器来说明这种模式。

您将了解不同方法之间的区别,最后您必须牢记进行此类操作的正确方法!

您还可以看到这个处理延迟加载操作的类似SO 线程

于 2012-06-02T10:34:47.317 回答