2012-06-02 25 views
0

我從網上下載圖像到我的android項目有一點問題。每次我嘗試連接到互聯網時,我的應用程序只是不斷崩潰。
是我加了許可權的Manifest.xml只要我下載圖片,Android應用程序崩潰

<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 

花了將近一個小時,現在試圖找出什麼問題....

+0

http://stackoverflow.com/questions/6343166/ Android的操作系統networkonmainthreadexception/6343299#6343299 – Akram

回答

1

您必須使用AsyncTask從服務器下載圖像,因爲您的主線程無法處理它。並且您正在嘗試在主線程中下載圖像。因此,NetworkOnMainThreadException會出現。因此要在單獨的線程中下載圖像。

See this Example

0

每個內容必須建立在一個獨立的線程下載的...你可以使用的AsyncTask,主題...

0

您應該使用這個異步任務,這是一種安全防範所以你的主線程(ui線程)不會掛起。他們在3.0或3.1把這個到位生病只是挖舊文章爲expample你

HTTP POST request ANDROID 4 (working in 2.3)?

這將是非常不好的做法,違背Android和在主線程中做網絡。他們這樣做是有原因的,如果你不這樣做,很有可能是fc。

0

創建響應式應用程序的一個很好的做法是確保您的主UI線程執行最少量的工作。任何可能導致應用程序掛起的長時間任務應該在不同的線程中處理(後臺線程)。當你在你的主線程上處理長時間的操作時,你會失去你的android應用程序的響應,如果你在網絡操作中使用這些任務,你會得到android.os.NetworkOnMainThreadException異常拋出給你。

此類任務的典型示例是網絡操作,涉及不可預知的延遲。用戶會忍受一些暫停,特別是如果您提供反饋意見,表示正在進行某些操作,但凍結的應用程序不會給他們提供任何線索。

在這個article,我們將創建一個簡單的圖像下載,說明這種模式

,您將學習型動物approches之間的差異,最後你要記住做這樣的操作正確的方式!

你也可以看到這個simular SO thread與延遲加載操作涉及

0

請參閱本answer

當應用程序試圖在其主線程進行網絡操作時引發的異常。

這僅適用於定位到Honeycomb SDK或更高版本的應用程序。針對早期SDK版本的應用程序允許在其主要事件循環線程上進行聯網,但非常不鼓勵。請參閱文檔Designing for Responsiveness。

欲瞭解更多詳情,請訪問Android developer site

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); 
    } 
}