Android中Textview顯示帶html文本三-------【Textview顯示網絡圖片】


上篇我講了Textview顯示本地圖片,具體請看Android中Textview顯示帶html文本二-------【Textview顯示本地圖片】

上篇遺留下來一個問題就是:顯示網絡圖片,我用android2.3的系統,可以顯示圖片出來,並且如果圖片比較大,應用會卡的現象,肯定是因爲使用主線程去獲取網絡圖片造成的,但如果我用android4.0以上的系統運行,則不能顯示圖片,只顯示小方框。

究其原因,是在4.0的系統上執行的時候報錯了,異常是:android.os.NetworkOnMainThreadException 經過查文檔,原來是4.0系統不允許主線程(UI線程)訪問網絡,因此導致了其異常。說白了就是在主線程上訪問網絡,會造成主線程掛起,系統不允許使用了。

看到Android4.0不允許主線程(UI線程)訪問網絡,立馬腦子就想起來 ,不能用主線程訪問,可以開另外一個線程,把圖片下到本地sd卡中,之後在賦值到TextView裏面。不急着來代碼,我和大家在把這個邏輯在理一下:獲取圖片路徑——異步下載圖片——完成下載後重新賦值Textview

想到這裏,我就準備自己親自實踐下......於是,我就簡單的寫了文件下載類DownLoadUtils,有四個事件就是開始下載,下載中(返回進度),完成下載後,下載出錯!具體代碼就不貼出來了。大家可以自己去寫一個,下載文件的代碼搜下都有!下載類裏面用到了線程和Handler的的使用,下篇我具體講下這個。

下面是Activity頁面處理代碼:

View Code

下面來簡單的介紹下上面的代碼,最重要的就是有兩點,就是第一次把sText賦值Textview,在Html.ImageGetter的重載方法裏面去判斷該圖片文件是否已經下載,如果已經下載,就直接讀取SD卡里面的圖片文件,如上篇所講的Textview顯示本地圖片

//獲取本地文件返回Drawable
                drawable=Drawable.createFromPath(fileString);
                //設置圖片邊界
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

如果沒有下載就開啓一個下載線程

//啓動新線程下載
downLoadUtils.download(source, path+String.valueOf(source.hashCode()));

第二個重點就是監聽下載完成事件,完成下載以後,重新給Textview賦值

View Code

這樣做了之後,網絡圖片就可以顯示在Textview裏面。在網絡正常的情況下,如果是相同圖片只需要下載一次,這樣可以節省了手機的流量。

我還有一種解決方案就是不需要給Textview賦兩次值,就是首先解析出來圖片路徑,然後下載圖片,最後賦值給Textview,其實道理是一樣的,之前的做法是通過重載方法解析出來圖片的路徑然後下載圖片。只不過是多了一個賦值,沒有任何影響。大家有好的思路,也可以介紹下。

以上觀點只代表我個人意見。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章