0

Webから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

何が問題なのかを理解しようとして、ほぼ1時間費やしました。

4

6 に答える 6

3

onCreate()で画像をダウンロードするメソッドを使用している場合、同期操作として動作します。つまり、画像がダウンロードされるまで制御を返しません。直接呼び出すと、アクティビティのUIがフリーズします。これはそうではありません。 Android3.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

すべてのコンテンツは別のスレッドにダウンロードする必要があります...AsyncTask、Thread...を使用できます

于 2012-06-02T10:24:50.380 に答える
0

レスポンシブアプリケーションを作成する際の良い習慣は、メインUIスレッドが最小限の作業を実行することを確認することです。アプリケーションをハングさせる可能性のある長いタスクは、別のスレッド(バックグラウンドスレッド)で処理する必要があります。メインスレッドで長時間の操作を処理すると、Androidアプリの応答性が失われ、ネットワーク操作でそのようなタスクを使用している場合は、android.os.NetworkOnMainThreadException例外がスローされます。

このようなタスクの典型的な例は、予測できない遅延を伴うネットワーク操作です。特に何かが進行中であるというフィードバックを提供する場合、ユーザーはいくつかの一時停止を許容しますが、フリーズしたアプリケーションはユーザーに手がかりを与えません。

この記事では、このパターンを説明する簡単な画像ダウンローダーを作成します

異なるアプローチの違いを学び、最後にそのような操作を行う正しい方法を覚えておく必要があります!!

遅延読み込み操作を処理するこの類似のSOスレッドも表示されます

于 2012-06-02T10:34:47.317 に答える
0

これには非同期タスクを使用する必要があります。これは安全なガードであるため、メインスレッド(uiスレッド)がハングしません。彼らはこれを3.0または3.1に配置しましたが、例として古い投稿を掘り下げるだけです。

HTTPPOSTリクエストANDROID4(2.3で動作)?

アンドロイドに反対し、メインスレッドでネットワーキングを行うのは非常に悪い習慣です。彼らは理由のためにこれをしました、あなたがそうしなければそれはおそらくfcでしょう。

于 2012-06-02T10:27:37.793 に答える
0

この回答を参照してください

アプリケーションがメインスレッドでネットワーク操作を実行しようとしたときにスローされる例外。

これは、HoneycombSDK以降を対象とするアプリケーションに対してのみスローされます。以前のSDKバージョンを対象とするアプリケーションは、メインのイベントループスレッドでネットワークを構築できますが、お勧めできません。応答性のための設計のドキュメントを参照してください。

詳細については、Android開発者サイトをご覧ください。

于 2012-06-02T11:28:50.743 に答える