編輯:關於Android編程
遇到的問題如下:
java.lang.NullPointerException: Attempt to invoke virtual method ‘void java.io.BufferedReader.close()’ on a null object reference android.os.NetworkOnMainThreadException異常 android java.net.UnknownHostException: Unable to resolve host “…”: No address associated 錯誤 Genymotion虛擬器重的android6.0模擬器連不上網(沒完全解決)今天花了將近8個小時學習android文件下載知識,先是看視頻學習,然後自己動手敲代碼學習,我是跟著大神的視頻一個字一個字敲的,然而當我敲完,運行的時候突然遇到了這個問題:
FATAL EXCEPTION: main
Process: com.example.sun.downloadfilestudy, PID: 19432
java.lang.NullPointerException: Attempt to invoke virtual method ‘void java.io.BufferedReader.close()’ on a null object reference
at com.example.sun.utils.HttpDownloadUtil
at android.view.View.performClick(View.java:5198)
at android.view.View
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616
源代碼是如下:
public String downFile(String urlStr){ StringBuffer stringBuffer = new StringBuffer(); BufferedReader bufferedReader = null; URL url = null; String line = null; try { //創建一個URL對象 url = new URL(urlStr); //根據URL對象創建一個Http連接 HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); //使用IO讀取下載的文件數據 InputStream inputStream = urlConnection.getInputStream(); bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); while((line = bufferedReader.readLine()) != null){ stringBuffer.append(line); } }catch (MalformedURLException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); }finally{ try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } return stringBuffer.toString(); }
然後我就去百度“ java.lang.NullPointerException: Attempt to invoke virtual method ‘void java.io.BufferedReader.close()’ on a null object reference”
結果出來:
一大片英文的,雖然我英文還不錯,但是我還是不想看,我就不信那麼多中國人就我一個遇到這個問題,哈哈!於是我就自己分析試試,我猜測是“bufferedReader = new BufferedReader(new InputStreamReader(inputStream));”這句中的bufferedReader 為空,那麼也就意味著inputStream為空,也就可以推導出“ InputStream inputStream = urlConnection.getInputStream();”這句中的 urlConnection.getInputStream()為空,而我調試的過程中發現urlConnection這個不為空,於是我就猜測getInputStream()這個出錯了 ,於是我去百度“android getInputStream()出錯”結果我看到一個解釋是沒有配置權限:
然後我看了下我的AndroidManifast.xml文件,我記得我配過,果然有,我就呵呵了!然後我問我老師,老師說把這個:
都加上,於是我就加上了,還是同樣的錯,〒〒。後來我還懷疑我代碼中的url不對,於是我到處去網上找可以下載的文件的ip地址,結果找了好久都沒找到,全是下載的文件保存在哪,哎〒〒。
於是我就暫時放下這個問題,一直到下午老師說在他開發的網站上放一個test.txt文件讓我試試,我試了之後非常生氣,還是一樣的錯,我(╯▔皿▔)╯生氣了!!!!!!於是我發誓不把這個問題搞定我就不姓孫!!!!。
我去百度換了一個問法:”Android 文件下載失敗“,結果出來的真的讓我喜出望外啊,就有一個大神是這樣說的:需要注意的是在Android3.0之前的Android平台上可以直接Activity所在的線程中訪問網絡,下載網絡上的文件。但是這樣的話,如果下載的文件較大,或者網速比較慢的情況下,Activity界面就會處於無法及時響應用戶操作的狀態。Android3.0中如果在Activity所在的線程訪問網絡,調試執行時會出現異常信息:“android.os.NetworkOnMainThreadException”,無法獲取有效的HttpURLConnection對象。所以我們需要把訪問網絡,下載文件的操作放在另外的線程中。
還有一個大神是這樣說的:**
遇到的問題1. java.lang.NullPointerException報錯,2.android.os.NetworkOnMainThreadException異常
原因:urlCon.getInputStream()執行的時候出錯導致,得不到InputStream。這個異常大概意思是在主線程訪問網絡時出的異常。 造成這樣的錯誤原因是代碼不符合Android規范,Android在4.0之前的版本支持在主線程中訪問網絡,但是在4.0以後對這部分程序進行了優化,也就是說訪問網絡的代碼不能寫在主線程中了。 **
總之就一句話:”現在已經不能在當前線程中下載文件了,需要開一個單獨的線程來下載文件“!
原來的代碼是這樣的:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); downloadText = (Button) findViewById(R.id.downText); downloadText.setOnClickListener(new ButtonDownloadText()); } class ButtonDownloadText implements View.OnClickListener { @Override public void onClick(View v) { String url = "http://xssl.yzu.edu.cn/android/test.txt"; System.out.println(httpDownloadUtil.downFile(url)); } }
單獨開線程的代碼是這樣的:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttontxt = (Button) findViewById(R.id.buttontxt); //為buttontxt添加單擊事件監聽器 buttontxt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //創建一個匿名線程用於下載文件 new Thread() { public void run() { HttpDownloader httpDownloader = new HttpDownloader(); //調用httpDownloader對象的重載方法download下載txt文件 String txt = httpDownloader.download("http://xssl.yzu.edu.cn/android/test.txt "); System.out.println(txt); } }.start(); } });
於是我就改了代碼,本來以為大功告成了,沒想到又遇到一個問題:
“Unable to resolve host “…”: No address associated …”我的想法就是連接不了某個主機,我猜測是沒有連接網絡,於是我就去百度,有個大神是這樣說的:
我在android開發的時候經常會遇到這個錯誤,一般來說,造成這種錯誤的最普遍情況有兩種:
1.android設備網絡連接沒打開,例如3G網絡和WIFI網絡
所以,如果遇到這種錯誤時,請先查看網絡是否已正常連接.
2.Manifest文件沒有標明網絡訪問權限
如果確認網絡已經正常連接並且還是出這種錯誤的話,那麼請看下你的Manifest文件是否標明應用需要網絡訪問權限,如果沒標明的話,也訪問不了網絡,也會造成這種情況的.
//網絡訪問權限
我第二個已經確認過了,那只有第一個原因了,但是想想我使用Genymotion虛擬器的,不是用真機測試,可能Genymotion真的沒有聯網,我打開模擬的浏覽器輸入www.baidu.com真的打不開,於是我就去找Genymotion聯網的方法,
這個家伙和我遇到同樣的問題了,我看他的設置再看了我的設置都是和網上別人說的一樣,結果我們都還是連接不了網絡,我想當時他肯定和我一樣郁悶,不過幸運的是他問題下面有個大神給了提示:
也就是說一般來說按照這個設置就可以連上網了,不過在android 6.0上面,你還需要手動點擊wifi模塊,點擊連接wifi,就會自動連接了。於是我打開我Genymotion中的android6.0模擬器,手動連接wifi,結果一直連接不上,太讓我郁悶了,配置都對,就是連接不上,結果還給卡死了,於是我強制關閉模擬器,啟動了android5.0的模擬器真的就自動連上網了,在模擬器中打開浏覽器輸入www.baidu.com可以出來網頁了,於是我在Android Studio中重新將程序運行在android5.0模擬器上真的成功了!
感動到哭( ▼-▼ ),被我自己不放棄的精神感動哭了!於是記錄下這個不容易,記錄下解決方法,記錄下自己的慢慢成長,明天繼續加油!
android給我們提供了一個spinner控件,這個控件主要就是一個列表,那麼我們就來說說這個控件吧,這個控件在以前的也看見過,但今天還是從新介紹一遍吧。Spinner
Flux 架構介紹Flux 架構 被Facebook使用來構建他們的客戶端web應用。跟Clean Architecture一樣,它不是為移動應用設計的,但是它的特性和簡
今天在慕課網看了一個視頻,介紹了幾種圖像處理的方法,其中有一種就是鏡面效果,但是他是通過自定義view的方式實現的,但是算法都大同小異。他的自定義view:package
最近做的項目中需要實現斷點下載,即用戶一次下載可以分多次進行,下載過程可以中斷,在目前大多數的帶離線緩存的軟件都是需要實現這一功能。本文闡述了通過sqlite3簡單實現了