Android之NetworkOnMainThreadException異常

原文鏈接:http://blog.csdn.net/mad1989/article/details/25964495 ??

點擊閱讀原文


------------------------------------------------------------------

看名字就應該知道,是網絡請求在MainThread中產生的異常


先來看一下官網的解釋:

Class Overview

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.

Also see?StrictMode.

http://developer.android.com/intl/zh-cn/reference/android/os/NetworkOnMainThreadException.html


解釋一下,從Honeycomb SDK(3.0)開始,google不再允許網絡請求(HTTP、Socket)等相關操作直接在Main Thread類中,其實本來就不應該這樣做,直接在UI線程進行網絡操作,會阻塞UI、用戶體驗相當bad!即便google不禁止,一般情況下我們也不會這么做吧~

所以,也就是說,在Honeycomb SDK(3.0)以下的版本,你還可以繼續在Main Thread里這樣做,在3.0以上,就不行了,建議


1,和network有關比較耗時的操作放到一個子線程里,然后用Handler消息機制與主線程通信。

[java]?view plaincopy
在CODE上查看代碼片派生到我的代碼片
  1. public?void?onCreate(Bundle?savedInstanceState)?{??
  2. ????super.onCreate(savedInstanceState);??
  3. ????this.setContentView(R.layout.test);??
  4. ????//?開啟一個子線程,進行網絡操作,等待有返回結果,使用handler通知UI??
  5. ????new?Thread(networkTask).start();??
  6. }??
  7. ??
  8. Handler?handler?=?new?Handler()?{??
  9. ????@Override??
  10. ????public?void?handleMessage(Message?msg)?{??
  11. ????????super.handleMessage(msg);??
  12. ????????Bundle?data?=?msg.getData();??
  13. ????????String?val?=?data.getString("value");??
  14. ????????Log.i("mylog",?"請求結果為-->"?+?val);??
  15. ????????//?TODO??
  16. ????????//?UI界面的更新等相關操作??
  17. ????}??
  18. };??
  19. ??
  20. /**?
  21. ?*?網絡操作相關的子線程?
  22. ?*/??
  23. Runnable?networkTask?=?new?Runnable()?{??
  24. ??
  25. ????@Override??
  26. ????public?void?run()?{??
  27. ????????//?TODO??
  28. ????????//?在這里進行?http?request.網絡請求相關操作??
  29. ????????Message?msg?=?new?Message();??
  30. ????????Bundle?data?=?new?Bundle();??
  31. ????????data.putString("value",?"請求結果");??
  32. ????????msg.setData(data);??
  33. ????????handler.sendMessage(msg);??
  34. ????}??
  35. };??

2,使用異步機制如:asynctask,這個舉個簡單的加載網絡圖片的例子

[java]?view plaincopy
在CODE上查看代碼片派生到我的代碼片
  1. class?DownImage?extends?AsyncTask?{??
  2. ??
  3. ????private?ImageView?imageView;??
  4. ??
  5. ????public?DownImage(ImageView?imageView)?{??
  6. ????????this.imageView?=?imageView;??
  7. ????}??
  8. ??
  9. ????@Override??
  10. ????protected?Bitmap?doInBackground(String...?params)?{??
  11. ????????String?url?=?params[0];??
  12. ????????Bitmap?bitmap?=?null;??
  13. ????????try?{??
  14. ????????????//加載一個網絡圖片??
  15. ????????????InputStream?is?=?new?URL(url).openStream();??
  16. ????????????bitmap?=?BitmapFactory.decodeStream(is);??
  17. ????????}?catch?(Exception?e)?{??
  18. ????????????e.printStackTrace();??
  19. ????????}??
  20. ????????return?bitmap;??
  21. ????}??
  22. ??
  23. ????@Override??
  24. ????protected?void?onPostExecute(Bitmap?result)?{??
  25. ????????imageView.setImageBitmap(result);??
  26. ????}??
  27. }??

3,直接在main Thread 進行網絡操作的方法,網上給出的,我沒有具體測試:

在發起Http請求的Activity里面的onCreate函數里面添加如下代碼:

[java]?view plaincopy
在CODE上查看代碼片派生到我的代碼片
  1. StrictMode.setThreadPolicy(new?StrictMode.ThreadPolicy.Builder()??
  2. ????????.detectDiskReads().detectDiskWrites().detectNetwork()??
  3. ????????.penaltyLog().build());??
  4. StrictMode.setVmPolicy(new?StrictMode.VmPolicy.Builder()??
  5. ????????.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()??
  6. ????????.penaltyLog().penaltyDeath().build());??


請記住,如果在Main Thread里聲明了一個handler,這個handler所Post 的 Runnable(Thread)、以及處理的message都是在當前的mian線程里,非子線程。




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中國信通院金融科技負責人韓涵:大數據是生產資料的變革,區塊鏈是生產關系的變革...

在近日召開的“2018中國金融科技產業峰會”上,中國信息通信研究院主任工程師、金融科技負責人韓涵正式發布了《中國金融科技前沿技術發展趨勢及應用場景研究報告》,詳細講解了A(人工智能)B(區塊鏈)C&#x…

php mysql 拼音首字母,Mysql應用MySQL查詢漢字的拼音首字母實例教程

《Mysql應用MySQL查詢漢字的拼音首字母實例教程》要點:本文介紹了Mysql應用MySQL查詢漢字的拼音首字母實例教程,希望對您有用。如果有疑問,可以聯系我們。導讀:最好的方法還是用 PHP 來取拼音首字母,在 MySQL 里新建一個字段來存放…

java簡單紙牌游戲_活動回顧 | 暢玩法語紙牌游戲

11月17日下午,20級小伙伴們迎來了第二次法語角活動!這次外教Anne-Flore Vrac 老師為同學們安排了豐富有趣的法語紙牌游戲,快來一起回顧活動的精彩瞬間吧!集體游戲一:從1到30老師首先帶領同學們進行了“從1到30”的小游…

人臉識別門禁_小區人臉識別門禁或取代傳統門禁刷卡方式

可以說,社區是一個人口聚集的小型社會。首先社區的人流量很大,進出是十分頻繁。其次,社區的大門以及各處進出口是業主與訪客、外來人員等進進出出最關鍵的通道。因此,每個社區都會有一套成型的門禁系統,常見的是使用門…

Java Thread.join()詳解

原文地址:http://www.open-open.com/lib/view/open1371741636171.html 點擊閱讀原文 ------------------------------------------------------------- 一、使用方式。 join是Thread類的一個方法,啟動線程后直接調用,例如: Thr…

元類編程--property動態屬性

from datetime import date, datetime class User:def __init__(self, name, birthday):self.name nameself.birthday birthdayself._age 0# def get_age(self):# return datetime.now().year - self.birthday.yearproperty #動態屬性def age(self): #屬性描述符&#x…

php什么情況下使用靜態屬性,oop-做php項目什么時候該使用靜態屬性呢

一般我們做php項目 類里面 定義的方法 或者 屬性 都是普通的 什么時候該用 static 方法和屬性 有什么例子的我很少用 靜態屬性 就有一次用過 我在做會員中心 要獲取 會員菜單的時候 我用的private static $menu array();大家可以討論下嗎回復內容:一般我們做php項目…

vscode運行python文件_vscode怎么運行python文件

1、首先需要確保安裝了VScode的Python插件,打開Python腳本,可以直接拖入,點擊文件,點擊首選項里的用戶設置,這時候會用戶設置配置文件。2、然后在左邊文件CtrlF搜索Python關鍵字,找到pythonPath所在行3、然…

python輸出日期語句_如何從Python的原始語句中提取時間-日期-時間段信息

經過幾天的研究,我想出了以下方法來解決提取問題。在識別命題,然后識別月份并進行提取。在識別“-”,然后識別月份并進行提取。在部分代碼如下所示。(節選,需要上下文中的依賴項)new_w new_s.split()for j in range(len(new_w)):…

datepicker動態初始化

datepicker 初始化動態表單的input,需要調用jquery的on方法來給未來元素初始化。 //對動態添加的時間文本框進行動態初始化$(table).on("focus", ".datepicker", function () {//添加data屬性未來只初始化一次if ($(this).data("datepicke…

oracle中存儲過程 =,oracle中的存儲過程使用

一 存儲過程的基本應用1 創建存儲過程(SQL窗口)create or replace procedure update_staffasbeginupdate staff set name xy;commit;end update_staff;存儲過程適合做更新操作,特別是大量數據的更新2 查看存儲過程在數據字典中的信息(SQL窗口)select object_name,o…

python項目如何上線_django項目部署上線(示例代碼)

前言完善的django項目上線,有很多種上線的方法,比如apache, uwsgi, nginx等。這里只介紹2種,一種是django自帶的,另外一種則是nginx uwsgi完成介紹。這里的系統環境采用的是ubantu系統, python環境采用的是python3, d…

如何檢查python的庫是否安裝成功_如何測試redis是否安裝成功

下載Redis 下載好后 復制所在位置 cd 跳到 D:\Java\64bit 圖中的目錄位置 這樣便啟動成功了。 設置redis密碼的話要 到redis.conf中找到 requirepass關鍵字 設置密碼為123456 redis-cli.exe 進入客戶端 然后 auth 123456 注釋: auth 密碼 set 對象名 [a] 值[123] ge…

第三方類庫的學習心態

我們需要牢牢的記住:所有的第三方庫能實現的功能,我們使用原生的API只要花時間和精力也能實現,但是可能會出現很多的bug而且會花費較多的時間和精力,而且性能也不一定很好,第三方的庫會幫我們封裝底層的一些代碼&#…

HTTP返回碼

響應碼由三位十進制數字組成,它們出現在由HTTP服務器發送的響應的第一行。響應碼分五種類型,由它們的第一位數字表示:1.1xx:信息,請求收到,繼續處理2.2xx:成功,行為被成功地接受、理…

oracle樹結構統計,ORACLE 遞歸樹型結構統計匯總

區域平臺統計報表,省--市--區 匯總,還有各級醫院,匯總與列表要在一個列表顯示。用到ORACLE 會話時臨時表 GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS;遞歸樹: START WITH P.PARENTORG ‘ROOT‘CONNECT BY PRIOR P.ORG…

我們真的需要使用RxJava+Retrofit嗎?

原文:http://blog.csdn.net/TOYOTA11/article/details/53454925 點擊閱讀原文 RxJava詳解:http://gank.io/post/560e15be2dca930e00da1083 Retrofit詳解:http://www.tuicool.com/articles/AveimyQ --------------------------------------…

python ide如何運行_ide - 如何運行Python程序?

你問我很高興! 我正在努力在我們的wikibook中解釋這個問題(這顯然是不完整的)。 我們正在與Python新手合作,并且必須通過您正在詢問的內容幫助我們! Windows中的命令行Python: 使用編輯器中的“保存”或“另…

邏輯回歸算法_算法邏輯回歸

logistic回歸又稱logistic回歸分析,是一種廣義的線性回歸分析模型,常用于數據挖掘,疾病自動診斷,經濟預測等領域。例如,探討引發疾病的危險因素,并根據危險因素預測疾病發生的概率等。以胃癌病情分析為例&a…