Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android學習——文件下載遇到的問題及解決辦法

android學習——文件下載遇到的問題及解決辦法

編輯:關於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.HttpDownloadUtiloverride.downFile(HttpDownloadUtil.java:45)atcom.example.sun.utils.HttpDownloadUtiloverride.accessdispatch(HttpDownloadUtil.java)atcom.example.sun.utils.HttpDownloadUtil.downFile(HttpDownloadUtil.java:0)atcom.example.sun.downloadfilestudy.MainActivityButtonDownloadText.onClick(MainActivity.java:47)
at android.view.View.performClick(View.java:5198)
at android.view.ViewPerformClick.run(View.java:21147)atandroid.os.Handler.handleCallback(Handler.java:739)atandroid.os.Handler.dispatchMessage(Handler.java:95)atandroid.os.Looper.loop(Looper.java:148)atandroid.app.ActivityThread.main(ActivityThread.java:5417)atjava.lang.reflect.Method.invoke(NativeMethod)atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:726)
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模擬器上真的成功了!
感動到哭( ▼-▼ ),被我自己不放棄的精神感動哭了!於是記錄下這個不容易,記錄下解決方法,記錄下自己的慢慢成長,明天繼續加油!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved