-
我們發(fā)現(xiàn)異步加載出現(xiàn)圖片錯位的情況,圖片的排列順序有問題。 圖片顯示錯位的原因:ListView自身的緩存機(jī)制。正確的ListView沒有顯示正確的URL。 解決辦法:在適配器中給每一個圖片設(shè)置一個標(biāo)識Tag,Tag本身就是圖片對應(yīng)的url,也就是將圖片和 url 進(jìn)行了綁定。 如圖,只有當(dāng)Tag等于圖片自身的url的時候才加載圖片,否則保持原樣。避免了緩存圖片對正確圖片的影響。查看全部
-
在子線程中將Bitmap以message的形式發(fā)送出去: Bitmap bitmap = getBitmapFromURL(url);//從 url中獲取 bitmap。 Message message = Message.obtain();//此方法使用現(xiàn)有的、已回收的Message,提高M(jìn)essage的使用效率。 message.obj = bitmap;//將信息的內(nèi)容(obj)設(shè)置為 bitmap。 handler.sendMessage(message);//調(diào)用Handler將載有bitmap的Message發(fā)送出去。 注意這里的 Handler 要選擇android.os.Handler的。查看全部
-
將圖片的地址 urlString 轉(zhuǎn)變?yōu)?Bitmap。 基本上和網(wǎng)絡(luò)相關(guān)的操作都需要捕捉異常。 1. 將 urlString(字符串類型)轉(zhuǎn)變?yōu)?URL 類型對象url。 2. 通過 url 獲取連接對象 connection。方法:url.openConnection()。 3. 通過連接對象獲得輸入流,并用BufferedInputStream包裝: is = new BufferedInputStream(connection.getInputStream()); 4. 將輸入流解析為Bitmap:bitmap = BitmapFactory.decodeStream(is); 5. 釋放資源:connection.disconnect(); is.close();查看全部
-
邏輯梳理: 首先在 onCreate()方法中通過 new NewsAsyncTask().execute(URL) 將一個URL傳遞進(jìn)去,實現(xiàn)對這個URL的異步訪問。URL傳遞給方法 getJsonData(),通過該方法將URL對應(yīng)的Json格式數(shù)據(jù)轉(zhuǎn)化為我們所封裝的NewsBean對象。獲得的NewsBean對象在 onPostExecute()方法中傳遞給自定義的適配器 NewsAdapter,通過NewsAdapter構(gòu)造了一個ListView的數(shù)據(jù)源,并將數(shù)據(jù)源加載給了ListView。從而讓ListView顯示我們想要的數(shù)據(jù)。查看全部
-
最后在 onPostExecute()方法中將生成的 newsBean添加到 mListView:通過適配器加載: NewsAdapter adapter = new NewsAdapter(MainActivity.this,newsBeen); mListView.setAdapter(adapter);查看全部
-
getView()的重寫 1. 采取文藝式,在getView()之外創(chuàng)建一個內(nèi)部類 ViewHolder 封裝 Item 的三個控件。 2. 在getView()中定義ViewHolder對象 viewHolder。 3. 重點: (1)判斷 convertView是否為空,為空則初始化 viewHolder,使用 LayoutInflate的 inflate()方法將布局文件轉(zhuǎn)換為View對象賦值給 convertView。用過 convertView 的findViewById()方法初始化 viewHolder 的三個控件。最后別忘了建立起 convertView和 viewHolder 的關(guān)系:convertView.setTag(viewHolder); 如果 convertView 不為空,則取出 ViewHolder:viewHolder = (ViewHolder) convertView.getTag(); (2)給viewHolder的三個控件賦值,這里的圖片先設(shè)置默認(rèn)圖標(biāo),真正的圖標(biāo)將在異步加載中實現(xiàn)。 (3)返回 convertView。查看全部
-
將JSON格式數(shù)據(jù)轉(zhuǎn)變?yōu)?NewsBean對象,添加到List。 1. 獲得 Json 的Object對象:jsonObject = new JSONObject(jsonString); 2. 獲得 Json 數(shù)組(數(shù)組名叫data):JSONArray jsonArray = jsonObject.getJSONArray("data"); 3. 使用for循環(huán),遍歷這個數(shù)組,將數(shù)組的每一個元素都轉(zhuǎn)變?yōu)?NewsBean對象,然后將NewsBean對象添加到 List。查看全部
-
格式轉(zhuǎn)換:將 JSON 字符串轉(zhuǎn)換為我們想要的數(shù)據(jù)。這里僅僅先實現(xiàn)字符串的獲取。其中 Log.d("xys",jsonString)是把json字符串以日志的形式打印出來。 InputStream is由 new URL(url).openStream()獲得。此句功能與url.openConnection.getInputStream()相同,可根據(jù)URL直接聯(lián)網(wǎng)獲取網(wǎng)絡(luò)數(shù)據(jù),簡單粗暴!返回值類型為InputStream。 另外,不要忘記在配置文件中添加網(wǎng)絡(luò)權(quán)限:<uses-permission android:name="android.permission.INTERNET"></uses>查看全部
-
通過inputStream讀取網(wǎng)頁信息。 我們定義一個方法用于讀取輸入流: public String readStream(InputStream is){ InputStreamReader isr; String result=""; try { String line=""; isr = new InputStreamReader(is,"utf-8"); BufferedReader br = new BufferedReader(isr); while((line = br.readLine())!=null){ result += line; } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } 其中,傳進(jìn)參數(shù)InputStream is 是字節(jié)流,InputStreamReader(is,"utf-8")將字節(jié)流轉(zhuǎn)化為字符流,再通過BufferedReader封裝,以BufferedReader形式讀取出來,最終拼接到字符串result里面。這樣就完成了整個數(shù)據(jù)的讀取。 既然讀取了JSON字符串,接下來把它轉(zhuǎn)換為我們想要的數(shù)據(jù)。查看全部
-
http://idcbgp.cn/api/teacher?type=4&num=30上面的JSON數(shù)據(jù)便是我們所要異步加載的數(shù)據(jù)。 要點: 1. 獲取JSON格式數(shù)據(jù),再把JSON格式的數(shù)據(jù)轉(zhuǎn)化成我們所需要的數(shù)據(jù),加載到 ListView 里面。 2. 創(chuàng)建新的類NewsBean,用于封裝JSON格式的數(shù)據(jù)。每一個NewsBean都代表一行數(shù)據(jù)。在doInBackground()中的第三個參數(shù)便設(shè)置為List<NewsBean>,接下來List<NewsBean>會傳到adapter(適配器)中,最后加載給ListView,就可以在界面上顯示出JSON數(shù)據(jù)所代表的內(nèi)容信息。 3. 在AsyncTask的 doInBackground() 中獲取到傳遞進(jìn)來的URL,也就是JSON數(shù)據(jù)所在的網(wǎng)址。通過API返回JSON格式的數(shù)據(jù),并由此構(gòu)造出由NewsBean組成的List。查看全部
-
本節(jié)主要是Item布局的編程,還有主界面的編程。 主界面就是一個Listview,主要在于 item_layout.xml 的編寫。 在TextViwe中設(shè)置最大行數(shù)是為了防止在文字過多的情況下出現(xiàn)變形。查看全部
-
Android異步加載 異步加載:用異步的方式加載數(shù)據(jù),原因無非兩個:1.提高用戶體驗,用戶在加載數(shù)據(jù)的時候不會感覺到明顯的卡頓;2.安卓的要求。 異步加載最常用的兩種方式:多線程\線程池;AsyncTask。 其中AsyncTask的底層也是通過線程池實現(xiàn),所以二者異曲同工。查看全部
-
獲取json數(shù)據(jù)查看全部
-
Cache可以認(rèn)為是一個Map查看全部
-
sizeOf在每次加入內(nèi)存緩存的時候進(jìn)行調(diào)用查看全部
舉報
0/150
提交
取消