⑴ 如何為android緩存數據到本地
緩存數據到本地有三種方式:
1:通過文件File方式;
2:通過SQLite資料庫的方式;
3:通過shareprefences
⑵ android什麼情況下需要緩存
作為一個完成的應用程序,數據存儲操作是必不可少的。因此,Android系統一共提供了四種數據存儲方式。分別是:SharePreference、SQLite、Content Provider和File。由於Android系統中,數據基本都是私有的的,都是存放於「data/data/程序包名」目錄下,所以要實現數據共享,正確方式是使用Content Provider。
SQLite: SQLite是一個輕量級的資料庫,支持基本SQL語法,是常被採用的一種數據存儲方式。Android為此資料庫提供了一個名為SQLiteDatabase的類,封裝了一些操作資料庫的API。
SharedPreference: 除SQLite資料庫外,另一種常用的數據存儲方式,其本質就是一個xml文件,常用於存儲較簡單的參數設置。
File: 即常說的文件(I/O)存儲方法,常用語存儲大數量的數據,但是缺點是更新數據將是一件困難的事情。
ContentProvider: Android系統中能實現所有應用程序共享的一種數據存儲方式,由於數據通常在各應用間的是互相私密的,所以此存儲方式較少使用,但是其又是必不可少的一種存儲方式。例如音頻,視頻,圖片和通訊錄,一般都可以採用此種方式進行存儲。每個Content Provider都會對外提供一個公共的URI(包裝成Uri對象),如果應用程序有數據需要共享時,就需要使用Content Provider為這些數據定義一個URI,然後其他的應用程序就通過Content Provider傳入這個URI來對數據進行操作。
⑶ 請教貼android本地緩存機制
Android中提供的緩存機制是利用本地存儲實現的。
(1)新下載數據的時候,將數據緩存到本地。
(2)再次下載之前,先判定該資源是否已經被緩存,如果是,則優先使用本地資源;如果沒有被緩存,則湊個網路上下載資源,並進行緩存。
實際上使用緩存機制的時候,還要考慮到額外的兩個條件:空間和時間。
對於存儲空間的條件限制,處理方法一般是結合應用下載量大小和用戶選擇來確定,比如以緩存文本為主的應用,由於文本本身佔用極小的空間,其緩存大小可以根據用戶的磁碟空間大小來確定;以緩存圖片為主應用,由於圖片佔用空間較大,更加需要用戶參與指定空間大小。
對於時間的限制,可以通過設定緩存的過期時間來實現,為下載到緩存的數據設定時間戳,在讀取該緩存的時候,比較時間戳,超過時間限制的則需要更新該緩存。
在清空應用緩存的時候也需要謹慎,在存儲空間已滿,用戶注銷的時候可以考慮清空該用戶的整個緩存,而在普通升級應用的情況下並不需要清空整個緩存。
⑷ android list怎麼緩存
要想優化ListView首先要了解它的工作原理,列表的顯示需要三個元素:ListView、Adapter、顯示的數據;
這里的Adapter就是用到了適配器模式,不管傳入的是什麼View在ListView中都能顯示出來。
下面簡單說下上圖的原理:
1、如果你有幾千幾萬甚至更多的選項(item)時,其中只有可見的項目(滿屏顯示的Item數目)存在內存(說的優化就是說在內存中的優化!)中,其他的在Recycler中
2、ListView先請求一個type1視圖(getView)然後請求其他可見的項目。convertView在getView中是空(null)的,第一次都是為空的,只要顯示過了convertView都不為空,會保存在Recycler中
3、當item1滾出屏幕,並且一個新的項目從屏幕低端上來時,ListView再請求一個type1視圖。convertView此時不是空值了,它的值是item1。你只需設定新的數據然後返回convertView,不必重新創建一個視圖,省去了inflate和findViewById的時間,性能就得到了優化。
AneData全能文件恢復,超強數據恢復工具 硬碟移動硬碟SD卡U盤相機手機內存卡全支持
查 看
了解了它的工作原理後,我們就可以重復利用convertView,只要不為空就直接使用,改變它的內容就行了。
使用ListView的時候都會搭配一個Adapter,為了使得性能更優,ListView會緩存行item(某行對應的View)。ListView通過Adapter的getView函數獲得每行的item。
更多問題解決辦法請參考android學習手冊,例子、源碼、文檔全部搞定,採用androidstudo的目錄結構,360手機助手中下載。
java">packagecom.dzt.listviewdemo;
importjava.util.ArrayList;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.os.Bundle;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ImageView;
importandroid.widget.ListView;
importandroid.widget.TextView;
{
privateListAdapteradapter;
privateListViewlv=null;
privateArrayList<string>list=newArrayList<string>();
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView)findViewById(R.id.lv_list);
adapter=newListAdapter();
for(inti=0;i<100;i++){
list.add(item+i);
}
lv.setAdapter(adapter);
}
{
;
ListAdapter(){
mInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returnlist.size();
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnlist.get(position);
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
System.out.println(getView+position++convertView);
viewHolderholder=null;
if(convertView==null){
convertView=mInflater.inflate(R.layout.item,null);
holder=newviewHolder();
holder.text=(TextView)convertView.findViewById(R.id.tv_text);
holder.image=(ImageView)convertView
.findViewById(R.id.iv_img);
convertView.setTag(holder);
}else{
holder=(viewHolder)convertView.getTag();
}
holder.text.setText(list.get(position));
if(position%2==0){
holder.image.setImageResource(R.drawable.ic_launcher);
}else{
holder.image.setImageResource(R.drawable.icon);
}
returnconvertView;
}
}
/**
*使用一個類來保存Item中的元素
*
*@authorAdministrator
*
*/
publicstaticclassviewHolder{
publicTextViewtext;
publicImageViewimage;
}
}