listview+BaseAdapter + AsyncTask异步请求网络 + LruCache缓存

1,通过异步加载,避免阻塞UI线程

2,通过LruCache,将已经下载的图片放到内存中

3,,通过判断Listview滑动状态,决定何时加载图片

4,不仅仅是listview ,任何控件都可以使用异步加载

代码结构:

布局1,

<RelativeLayout xmlns:android="" xmlns:tools="" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ListView android:id="@+id/lv_main" android:layout_width="match_parent" android:layout_height="match_parent"/></RelativeLayout>

布局2

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="40dp" android:orientation="horizontal" > <ImageView android:id="@+id/iv_icon" android:layout_width="64dp" android:layout_height="64dp" android:src="@drawable/ic_launcher"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="4dp" android:orientation="vertical"> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:textSize="15sp" android:maxLines="1" android:text="title"/> <TextView android:id="@+id/tv_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="10sp" android:maxLines="3" android:text="content"/> </LinearLayout> </LinearLayout>

java代码:

package com.my.listviewbaseadapter;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.List;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.os.AsyncTask;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.widget.ListView;public class MainActivity extends Activity {private ListView mListView;private static String url = "**************************"; //一个含有图片,title,content三个内容的接口就行@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mListView = (ListView) findViewById(R.id.lv_main);new NewsAsyncTask().execute(url);}/** 讲url对应的json格式数据转化为我们所封装的NewsBean对象*/private List<NewsBean> getJsonData(String url) {List<NewsBean> newsBeanList = new ArrayList<NewsBean>();try {String jsonString = readStream(new URL(url).openStream());JSONObject jsonObject;NewsBean newsBean;try {jsonObject = new JSONObject(jsonString);JSONArray jsonArray = jsonObject.getJSONArray("data");for (int i = 0; i < jsonArray.length(); i++) {jsonObject = jsonArray.getJSONObject(i);newsBean = new NewsBean();newsBean.newsIconUrl = jsonObject.getString("picSmall");newsBean.newsTitle = jsonObject.getString("name");newsBean.newsTitle = jsonObject.getString("description");newsBeanList.add(newsBean);}} catch (Exception e) {// TODO: handle exception}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return newsBeanList;}/** 通过InputStream解析网页返回的数据*/private 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) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return result;}// AsyncTask<String, Void, Result>/** 实现网络的异步访问** AsyncTask<String, Void, Result>方法三个参数的含义 第一个参数String 是我们需要传入的url* 第二个参数Void是记录中间的过程* 第三个参数是我们返回的一个result,我们创建一个bean对象用于封装我们的json数据,最终返回的是Bean对象的集合*/class NewsAsyncTask extends AsyncTask<String, Void, List<NewsBean>> {@Overrideprotected List<NewsBean> doInBackground(String… params) {// TODO Auto-generated method stubreturn getJsonData(params[0]);}@Overrideprotected void onPostExecute(List<NewsBean> newsBeans) {// TODO Auto-generated method stubsuper.onPostExecute(newsBeans);NewsAdapter adapter = new NewsAdapter(MainActivity.this, newsBeans,mListView);mListView.setAdapter(adapter);}}}

有事者,事竟成;破釜沉舟,百二秦关终归楚;苦心人,

listview+BaseAdapter + AsyncTask异步请求网络 + LruCache缓存

相关文章:

你感兴趣的文章:

标签云: