從網絡上下載文件小功能點的思路

一、下載須要耗時,因此要啓動異步加載,首先下載文件;數據庫

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"nullnullnullnullnullnull);

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}, nullnullnull);

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就不須要每次要用的時候都從網絡上下載,設置網絡超時的時間等等。

相關文章
相關標籤/搜索