一、下載須要耗時,因此要啓動異步加載,首先下載文件;數據庫
class Josntask extendsAsyncTask<String, Void, String>json
String string = params[0];緩存
is =connection.getInputStream(); 網絡
int len=0;app
byte[] buffer=newbyte[1024];異步
while((len=is.read(buffer))!=-1){ide
arrayBuffer.append(buffer,0, len) }優化
String string=new String(arrayBuffer.toByteArray(), 0, arrayBuffer.length());//用來保存數據編碼
return stringurl
二、將數據用Jsonobject解析,用對象封裝DataItem,並保存到arraylist
JSONArray array=new JSONArray(result);
for (int i = 0; i < array.length(); i++) {
JSONObject jsonObject = array.getJSONObject(i);
String pic = jsonObject.getString("pic");
String fname = jsonObject.getString("fname");
String sname = jsonObject.getString("sname");
String time = jsonObject.getString("time");
DataItem dataItem=new DataItem(pic, fname, sname, time);
arrayList.add(0,dataItem);
三、listview數據發生更變,這時同時適配器更新
adapter.notifyDataSetChanged();
四、啓動異步加載,下載圖片
String string = params[0];
URL url=new URL(string);
URLConnection connection =url.openConnection();
is =connection.getInputStream();
bitmap = BitmapFactory.decodeStream(is)p_w_picpathMap.put(string, bitmap);
五、判斷若是圖片有出如今屏幕纔去更新圖片,不然會產生跳變
int fs=listView.getFirstVisiblePosition();//第一行
int count=listView.getChildCount();//總行數
int ls=fs+count-1;//最後一行
if(position>=fs && position<=ls)
{
p_w_picpathView.setImageBitmap(result);
}
六、作二級緩存(目的是讓用戶打開界面,若是沒有網絡的話,能夠看到前幾天更新的數據)
首先界面一打開就從數據庫中讀取數據
Cursor cursor = mDB.query("datadb", null, null, null, null, null, null);
boolean hasData =cursor.moveToFirst();
while(hasData){
Stringfname = cursor.getString(cursor.getColumnIndex("fname"));
Stringsname = cursor.getString(cursor.getColumnIndex("sname"));
Stringtime = cursor.getString(cursor.getColumnIndex("time"));
Stringpic = cursor.getString(cursor.getColumnIndex("pic"));
DataItemdataItem=new DataItem(pic, fname, sname, time);
arrayList.add(dataItem);
hasData=cursor.moveToNext();
而後在onPostExecute也就是有網絡的時候從網絡上保存數據到數據庫
ContentValues values=new ContentValues();
values.put("fname", dataItem.fname);
values.put("sname", dataItem.sname);
values.put("time", dataItem.time);
values.put("pic", dataItem.pic);
mDB.insert("datadb", null, values);
最後保存圖片:
一開機首先查找數據庫是有保存地址,若是有把圖片轉換成圖片對象
Cursor cursor = mDB.query("datadb", null, "fname=?", new String[]{fname}, null, null, null);
boolean hasData = cursor.moveToFirst();
if(hasData)
{
String pic = cursor.getString(cursor.getColumnIndex("pic"));
if(pic!=null && !"".equals(pic))//判斷圖片地址是否爲空
{
File file=new File(pic);
if(file.exists())
{
FileInputStream fis=new FileInputStream(file);
Bitmap bitmap = BitmapFactory.decodeStream(fis);
if(bitmap!=null)
{
p_w_picpathMap.put(params[0], bitmap);
return bitmap;
}
若是圖片地址爲空的話,就從網絡上下載,而且保持到sdcard中,更新到數據庫
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))//判斷sdcard狀態是否可用
URL url=new URL(string);
URLConnection connection = url.openConnection();
is = connection.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
if(bitmap!=null)
{
p_w_picpathMap.put(string, bitmap);
String path = url.getPath();//獲取圖片路徑
int lastIndexOf = path.lastIndexOf("/");//獲取圖片的名字
String filename = path.substring(lastIndexOf);
File sdcardfile= Environment.getExternalStorageDirectory();//獲取sdcard地址
Filefile=new File(sdcardfile.getAbsolutePath()+"/p_w_picpath/"+filename);//拼接sdcard路徑
File parentFile = file.getParentFile();//文件夾的路徑
if(!parentFile.exists())
{
parentFile.mkdirs();//若是文件夾不存在就建立,第一保存不存在
}
FileOutputStream fos=new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);//將Bitmap壓縮成JPEG編碼,質量爲100%存儲
fos.flush();
update(file.getAbsolutePath(),fname);//更新數據庫圖片地址
最後須要作其餘的優化,例如listview的複用,圖片最好保存到hashmap就不須要每次要用的時候都從網絡上下載,設置網絡超時的時間等等。