-
異步加載——實現(xiàn)ListView圖文混排邏輯總結(jié) 第一步 onCreate中new一個NewsAsyncTask 將url傳遞給getJsonData 實現(xiàn)異步訪問 第二步 getJsonData將url轉(zhuǎn)換為NewsBean對象 第三步 onPostExecute講NewsBean的數(shù)據(jù)傳遞給NewsAdapter 第四步 NewsAdapter構(gòu)造一個ListView數(shù)據(jù)源 并將數(shù)據(jù)源設(shè)置給ListView 異步加載的第一層:通過AsyncTask訪問網(wǎng)絡(luò),獲取json或者XML字符串,然后解析他們產(chǎn)生若干object,將每個object放入到ListVIew中(adapter需要使用view holder pattern去寫),AsyncTask中的訪問網(wǎng)絡(luò)獲取json或者XML字符串,并且產(chǎn)生若干個object的工作就是在doInBackground()方法中進行的,所以這個方法總的來說就是用來準備數(shù)據(jù)源的。查看全部
-
本節(jié)課目標:文藝方式重現(xiàn)BaseAdpter 1、自定義Adpter繼承BaseAdpter; 2、定義變量:List<NewsBean>;LayoutInflater; 3、重寫構(gòu)造函數(shù)NewsAdpter(Context context, List<NewsBean> data)。 4、文藝方式重寫getView()方法。 4.1、自定義類ViewHolder,映射相關(guān)的view對象查看全部
-
異步加載 1. 主線程中不能做耗時操作,只能更新UI 下面的例子 2. 獲取jsonData url = http://idcbgp.cn/api/teacher?type=4&num=30 下面的openStream參數(shù)是從URL參數(shù)中new URL(url).openStream()獲取的。 private String readStream(InputStream openStream) { InputStreamReader isr; String result = ""; try { String line = ""; //將InputStream類的字節(jié)流轉(zhuǎn)換成字符流 isr = new InputStreamReader(openStream, "utf-8"); //轉(zhuǎn)存在BufferedReader中 BufferedReader br = new BufferedReader(isr); while((line = br.readLine())!=null) { result+=line; } } return result; } InputStream is=new URL(url).openStream() ---------------new URL(url).openConnection().getInputStream() Json字符串string的處理: JSONObject jsonObject=new JSONObject(jsonstring) JSONArray jsonArray =jsonObject.getJSONArray("數(shù)組名") JSONObject object=jsonArray.getJsonObject(i) object.get("")屬性名查看全部
-
3. 解析json數(shù)據(jù)到List<NewsBean>中 jsonobject=new JsonObject(jsonString); jsonArray=jsonobject.getjsonArray("data"); NewsBean newsBean; (如圖),通過如下for循環(huán)就可以將jsonString原始字符數(shù)據(jù)導(dǎo)入到每個NewsBean對象中。 for (int i = 0; i<jsonArray.length(); i++) { jsonObject = jsonArray.getJSONObject(i); newsBean = new NewsBean(); //從jsonObject中得到每個元素數(shù)據(jù)給newsBean newsBean.image = jsonObject.getString("picSmall"); newsBean.title = jsonObject.getString("name"); newsBean.content = jsonObject.getString("description"); newsBeanList.add(newsBean); } 最后通過newsBeanList.add(newsBean)組成一個List<NewsBean>對象,這是構(gòu)成Adapter適配器的原始數(shù)據(jù)。查看全部
-
利用異步加載來實現(xiàn)json格式的獲?。?首先定義異步加載類來獲取json數(shù)據(jù) jsonString數(shù)據(jù)的獲取需要用到InputStream 構(gòu)造ReadStream(InputStream is )得到String 數(shù)據(jù) 傳給jsonString : 1、InputStremReader 讀取 InputStream 2、轉(zhuǎn)為BufferedStream 便于修改 3、逐行讀取數(shù)據(jù)line = br.readline() 只要 line !=null -->result +=line 4、return result 獲取到的json數(shù)據(jù)封裝成Bean格式之后再傳給Adapter(下一節(jié))查看全部
-
一、如何通過Url獲取網(wǎng)絡(luò)反饋的Json字符串結(jié)果: 1、重寫doInBackground(Params…) 獲取請求的網(wǎng)址,調(diào)用自定義方法getJson(String url); 2、自定義方法getJson中定義URL,獲取inputStream流 3、自定義方法readStream(InputStream is),將inputStream流中的字節(jié)流拼裝成字符串; 4、自定義方法getJson調(diào)用readeStream()方法,并將InputStream流作為參數(shù)傳遞。這樣既可獲得json串結(jié)果。 通過InputStream讀取一個網(wǎng)絡(luò)信息。<br> 1.InputStream字節(jié)流,通過InputStreamReader(-,"utf-8")指定其格式將字節(jié)流轉(zhuǎn)化為字符流。<br> 2.再通過BufferedReader將這樣一個字符流以Buffer的形式讀取出來,最終拼接到result里面,這樣就完成了整個數(shù)據(jù)的讀取查看全部
-
布局文件查看全部
-
什么是異步加載:就是用異步的方式去加載數(shù)據(jù) 使用異步加載的原因 1.android是單線程模型 2.耗時操作都必須放在單獨的線程中去做,而不能去阻塞UI線程 異步加載最常用的兩種方式 1.多線程\線程池 2.AsyncTask(底層也是基于線程池來實現(xiàn)的)查看全部
-
獲取bitmap查看全部
-
獲取json查看全部
-
讀取json數(shù)據(jù)查看全部
-
API接口:idcbgp.cn/api/teacher?type=48&num=30查看全部
-
layout中限制行數(shù)使用maxLines查看全部
-
異步加載——LruCache緩存 (接上一筆記) (3)改寫showImageByAsyncTask()和doInBackground() bitmap不在緩存中時才下載;下載完之后保存在cache中。 public void showImageByAsyncTask(ImageView imageView, String url){ //從緩存中獲取對應(yīng)的圖片并判斷 Bitmap bitmap = getBitmapFromCache(url); if(bitmap == null){ new NewsAsyncTask(imageView, url).execute(url); }else { //從緩存中直接獲取數(shù)據(jù)讓iamgeView顯示 imageView.setImageBitmap(bitmap); } } protected Bitmap doInBackground(String... params) { String url = params[0]; Bitmap bitmap = getBitmapFromURL(url); if(bitmap!=null){ addBitmapToCache(url, bitmap); } return bitmap; } (4)最后要在創(chuàng)建Adapter對象時給ImageLoader的對象初始化,直接使用該對象。這樣不會每次都創(chuàng)建LruCache。 public NewsAdapter(Context context, List<NewsBean> mListData) { super(); this.mList = mListData; mInflater = LayoutInflater.from(context); mImageLoader = new ImageLoader(); } //通過AsyncTask執(zhí)行顯示ImageView額操作 mImageLoader.showImageByAsyncTask(viewHolder.imageView, urlString);查看全部
-
異步加載——LruCache緩存 1. Lrc——Least Recently Used,LruCache類來實現(xiàn)緩存算法。 LruCache類將內(nèi)容保存在內(nèi)存中,并以一定的方法管理這些內(nèi)容,來實現(xiàn)緩存管理。 2. LrcCache本質(zhì)是一個Map,底層是通過HashMap實現(xiàn)的。 所以在使用LruCache時可以通過調(diào)用set()和get()方法使用。 3. 使用步驟: (1)先創(chuàng)建一個LruCache,并在構(gòu)造函數(shù)中初始化它。 注意:通過匿名內(nèi)部類的方式實現(xiàn)sizeOf()方法,sizeOf()方法用來獲取每次緩存的對象的大小,默認返回元素的個數(shù)。sizeOf()方法在每次元素加入緩存時調(diào)用。 private LruCache<String, Bitmap> mLruCache; public ImageLoader() { //通過Runtime類獲取運行時最大內(nèi)存 int maxMemory = (int) Runtime.getRuntime().maxMemory(); int cacheSize = maxMemory/4; mLruCache = new LruCache<String, Bitmap>(cacheSize){ protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); }};} (2)兩個set()和get()方法,分別是加入元素到緩存以及從緩存中獲取數(shù)據(jù) public void addBitmapToCache(String url, Bitmap bitmap){ if(getBitmapFromCache(url)==null){ mLruCache.put(url, bitmap); } } public Bitmap getBitmapFromCache(String url){ return mLruCache.get(url); } (3)改寫showImageByAsyncTask()和doInBackground() (如圖)bitmap不在緩存中時才下載;下載完之后保存在cache中。 (4)最后要在創(chuàng)建Adapter對象時給ImageLoader的對象初始化,直接使用該對象。這樣不會每次都創(chuàng)建LruCache。查看全部
舉報
0/150
提交
取消