編輯:關於Android編程
昨天和女朋友換了手機,我的iPhone 4S 換了她得三星I9003。第一感覺就是好卡,果斷刷機。以前是Android 2.3的系統。回來刷成了4.4。
好了,問題來了。在我用手機測試我們的APP的時候,拋出一個如題的異常:android.os.NetworkOnMainThreadException
第一次看到這異常,字面意思是說:在主線程中的網絡異常。然後我就去了解了下這個異常,先看看官方的說明:
public class
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
.
所以事情就很清楚了。一個APP如果在主線程中請求網絡操作,將會拋出此異常。Android這個設計是為了防止網絡請求時間過長而導致界面假死的情況發生。
解決方案有兩個,一個是使用StrictMode,二是使用線程來操作網絡請求。
第一種方法:簡單暴力,強制使用,代碼修改簡單(但是非常不推薦)
在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代碼
if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); }
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.main_view); new Thread(runnable).start(); } Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle data = msg.getData(); String val = data.getString("value"); Log.i(TAG,"請求結果:" + val); } } Runnable runnable = new Runnable(){ @Override public void run() { // TODO: http request. Message msg = new Message(); Bundle data = new Bundle(); data.putString("value","請求結果"); msg.setData(data); handler.sendMessage(msg); } }
// Android 4.0 之後不能在主線程中請求HTTP請求 new Thread(new Runnable(){ @Override public void run() { cachedImage = asyncImageLoader.loadDrawable(imageUrl, position); imageView.setImageDrawable(cachedImage); } }).start();
好了今天這個破事就到這裡,其實android開發就這麼點破事。關於其他破事,見專欄:
更多Android開發的破事,請看專欄:《Android開發那點破事》
--------------------------------------廣播機制簡介-----------------------------------------
本文實例講述了android編程之menu按鍵功能實現方法。分享給大家供大家參考。具體分析如下:android應用程序可以通過menu按鍵彈出菜單,現在通過menu按鍵彈
1.多窗口支持Android N 添加了對同時顯示多個應用窗口的支持。 在手持設備上,兩個應用可以在“分屏”模式中左右並排或上下並排顯示。在電視設
(1)布局文件代碼 (2)控制的類 package com.example.android_switch; import androi
效果圖:1、實現列表頭部的圖片輪播,方式:給RecyclerView添加