1. 程式人生 > >Android主執行緒不能訪問網路異常解決辦法 NetworkOnMainThreadException錯誤

Android主執行緒不能訪問網路異常解決辦法 NetworkOnMainThreadException錯誤

Android Activity主執行緒預設情況下不允許訪問網路

轉自http://www.cnblogs.com/lyroge/p/3837902.html

從兩個方面說下這個問題:

1. 不讓訪問網路的原因

2. 解決該問題的辦法

不讓訪問網路的原因:

由於對於網路狀況的不可預見性,很有可能在網路訪問的時候造成阻塞,那麼這樣一來我們的主執行緒UI執行緒 就會出現假死的現象,產生很不好的使用者體驗。所以,預設的情況下如果直接在主執行緒中訪問就報出了這個異常,名字是NetworkOnMainThreadException

解決該問題的辦法

1. 獨立執行緒

2. 非同步執行緒AsyncTask

3. StrictMode修改預設的策略

1) 獨立執行緒的辦法

啟動一個新執行緒的程式碼:
new Thread(){

@Override

public void run() {

Dosomething();

handler.sendEmptyMessage(0);

}

}.start();

此處我們重寫了執行緒類的run方法,執行Dosomething. 在裡面還有個handler物件,這又涉及到了跨執行緒修改UI元素內容的問題。在java中是不允許跨執行緒修改UI元素的,如我們在新啟動的執行緒中想去修改UI主執行緒中TextView的文字時,會報錯誤的。如果想做這樣的操作,我們就得藉助Handler這個類來實現。 關於這個

handler類的用法,我們單獨的再來寫一篇部落格進行介紹。

2) 非同步呼叫的方法 AsyncTask
3) StrictMode修改預設的策略

在我們的Activity類的onCreate方法中,設定如下規則:
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

這樣也可以解決這個問題

關於StrictMode的具體介紹,請看另一個部落格介紹的非常詳細:


相關推薦

Android執行不能訪問網路異常解決辦法 NetworkOnMainThreadException錯誤

Android Activity主執行緒預設情況下不允許訪問網路 轉自http://www.cnblogs.com/lyroge/p/3837902.html 從兩個方面說下這個問題: 1. 不讓訪問網路的原因 2. 解決該問題的辦法 不讓訪問網路的原因: 由於對於網

android 4.0 執行訪問網路異常

    android出現如下異常資訊,是因為4.0以上不允許在主執行緒中訪問網路。     1.可以再Activity的onCreate()方法中加入這樣一段程式碼,如下: if (Build.VERSION.SDK_INT >= 11) {StrictMode.s

問題描述: android.os.NetworkOnMainThreadException異常(不要在執行訪問網路資源)

問題描述: android.os.NetworkOnMainThreadException異常(不要在主執行緒訪問網路資源) 問題分析: 造成這種異常的原因是安卓版本問題(仔細研究錯誤原因是程式碼不符合Android規範),網上搜索發現:android3.0版本開始(具體是

安卓4.0以後執行訪問網路問題(NetworkOnMainThreadException解決方法及子執行更新ui

安卓4.0之後谷歌建議不在主執行緒訪問網路,可能是因為訪問網路可能會等待時間長造成假死現象,解決辦法無非是強行訪問和開一個子執行緒訪問 1.強行訪問: 在activity裡面onCreate方法裡面加

關於android執行不能訪問網路異常NetworkOnMainThreadException

獲取網路圖片: //圖片處理 ImageGetter imgGetter2 = new Html.ImageGetter() { public Drawable getDrawable(Stri

Android執行裡不允許網路操作

Keywords: Android UI執行緒/主執行緒 PENALTY_DEATH_ON_NETWORKAndroid API > 9 (Honeycomb及之後)版本里,對UI執行緒/主執行緒裡是不允許聯網操作的,如果有網路操作,會丟擲NetworkOnMainTh

Android執行向子執行中傳送資訊

主要用到了Handler類,Looper類和Message類 先介紹下這幾個類 Looper類,是用來為一個執行緒開啟一個訊息佇列,預設情況下Android下新開啟的執行緒沒有開啟訊息佇列的,除了主執行緒外,主執行緒系統會預設為其開啟一個訊息佇列;looper是通過MessageQueu

android執行中Looper.loop()為什麼不會造成程式ANR

程式入口為ActivityThread的main方法,原始碼如下: frameworks/base/core/java/android/app/ActivityThread.java public static void main(String[] args) { S

Android執行更新UI 異常

眾所周知,Android是不可以在子執行緒中直接更新UI的,需要藉助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runnable)將更新的程式碼切入到主執行緒中去實現UI更新。 我們來試一下,在Activity的 onCreat

執行間操作無效: 從不是建立控制元件“”的執行訪問它~~~的解決方法~

http://www.cnblogs.com/HaoKeKe/p/4427902.html http://blog.csdn.net/dongzhe8/article/details/45791877 Control.CheckForIllegalCrossThreadCa

Android執行中延時處理

Android對UI主執行緒開啟了實時監聽,Activity Manager和WindowManager系統服務一旦監聽到主執行緒超過10秒沒有響應操作,就會丟擲ANR,所以,在UI主執行緒中不能直接呼叫Thread.sleep方法去延時,超過10秒就根本不會執

Android執行(ActivityThread)原始碼分析

在寫這篇部落格之前,先丟擲一個問題,安卓應用程式的入口是什麼呢?我想不少人可能回答說:application的onCreate方法,其實並不是的,即使是application,也有一個方法比onCreate先執行,這個方法就是attachBaseContext(Context

非同步委託跨執行訪問控制元件解決介面卡死

下面來看第二種方案,就是使用delegate和invoke來從其他執行緒中控制控制元件資訊。網上有很多人寫了這種控制方式,然而我看了很多這種帖子,表明上看來是沒有什麼問題的,但是實際上並沒有解決這個問題,首先來看網路上的那種不完善的方式: public partial cl

android執行和子執行的區別

android 主執行緒和子執行緒有什麼區別本文較為深入的分析了android中UI主執行緒與子執行緒。分享給大家供大家參考。具體如下:在一個Android 程式開始執行的時候,會單獨啟動一個Process。預設的情況下,所有這個程式中的Activity或者Service(S

SimpleDateFormat執行不安全及解決辦法

一. 為什麼SimpleDateFormat不是執行緒安全的? Java原始碼如下: /** * Date formats are not synchronized. * It is recommended to create separate format instan

android studio 執行按鈕為灰色的解決辦法之一

先說說我的情況。安裝完android studio 3.2 和SDK,配置好環境後,我新建了一個hello world專案,gradle download 下載半天沒有動靜我就離線下載了一下對應的包然後放到對應路徑下,再次重啟這個專案,專案搭建完成,準備執行。 但是發現如下問題,run

執行死鎖及解決辦法

死鎖是由於不同執行緒按照不同順序進行加鎖而造成的。如: 執行緒A:對lock a加鎖 => 對lock b加鎖 => dosth => 釋放lock b => 釋放lock a 執行緒B:對lock b加鎖 => 對lock a加鎖 

在副執行中LoadString失敗解決辦法

在COM元件中的呼叫函式的開始應該要加上AFX_MANAGE_STATE(AfxGetStaticModuleState()),來切換Module State。當前的resource handle是在Module State中儲存的,LoadString需要這個Resource Handle來知道應該在那個M

解決執行不能訪問網路的問題

             在android4.0及以後版本的開發中,如果在android的主執行緒中進行網路訪問,會報錯。 解決該問題的方法: 1.在oncreate()方法中新增這段程式碼,即可在主

[轉]Android限制只能在執行中進行UI訪問的實現原理

目錄 Android限制只能在主執行緒中進行UI訪問 Thread的實現 Android Thread 的構造方法 Android Thread 的start()方法 如何在我們自己的程式碼中去檢測當前Thread是不是UI執