1:ContentValues 的用法,對比HashTable:
ContentValues 和HashTable類似都是一種存儲的機制 但是兩者最大的差別就在于,contenvalues隻能存儲基本類型的資料,像string,int之類的,不能存儲對象這種東西,而HashTable卻可以存儲對象。
在忘資料庫中插入資料的時候,首先應該有一個ContentValues的對象是以:
ContentValues initialValues = new ContentValues();//語句執行個體化一個contentValues類。
initialValues.put(key,values);//語句将列名和對應的列值放置到initialValues裡邊。
SQLiteDataBase sdb ;
sdb.insert(database_name,null,initialValues);//語句負責插入一條新的紀錄,如果插入成功則會傳回這條記錄的id,如果插入失敗會傳回-1。
2:android中listview的優化方式
istview的優化其實就是去找getView中的耗時操作,然後提取出來,要麼使用異步的方式為item的布局設定資料,要是實在需要同步,就隻能在Adapter初始化時将資料準備好,然後再getView中隻需綁定一下就行。
listview可以說是Android開發中最常見的UI控件了,listview能夠以清單的方式顯示大量同類的資料,這樣問題就産生了,既然是大量資料,就會使用到很多布局,給布局綁定資料,listview将占用大量資源還可能會産生卡頓現象。
listview現在最常用也擁有很好的性能的優化方式是在Adapter中使用靜态的ViewHolder,具體代碼如下:
private TestAdapter mAdapter;
private String[] mArrData;
private TextView mTV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTV = (TextView) findViewById(R.id.tvShow);
mArrData = new String[1000];
for (int i = 0; i < 1000; i++) {
mArrData[i] = "Google IO Adapter" + i;
}
mAdapter = new TestAdapter(this, mArrData);
((ListView) findViewById(android.R.id.list)).setAdapter(mAdapter);
}
Adapter
private int count = 0;
private long sum = 0L;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 開始計時
long startTime = System.nanoTime();
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text,
null);
holder = new ViewHolder();
holder.icon1 = (ImageView) convertView.findViewById(R.id.icon1);
holder.text1 = (TextView) convertView.findViewById(R.id.text1);
holder.icon2 = (ImageView) convertView.findViewById(R.id.icon2);
holder.text2 = (TextView) convertView.findViewById(R.id.text2);
convertView.setTag(holder);
}
else{
holder = (ViewHolder)convertView.getTag();
}
holder.icon1.setImageResource(R.drawable.icon);
holder.text1.setText(mData[position]);
holder.icon2 .setImageResource(R.drawable.icon);
holder.text2.setText(mData[position]);
// 停止計時
long endTime = System.nanoTime();
// 計算耗時
long val = (endTime - startTime) / 1000L;
Log.e("Test", "Position:" + position + ":" + val);
if (count < 100) {
if (val < 1000L) {
sum += val;
count++;
}
} else
mTV.setText(String.valueOf(sum / 100L));// 顯示統計結果
return convertView;
}
}
static class ViewHolder {
TextView text1;
ImageView icon1;
TextView text2;
ImageView icon2;
}
在Adapter的代碼中,在getView方法裡首先判斷convertView是否為空,若為空則加載相應布局,若不為空則直接使用該布局,這能夠很有效的使用Android為listview提供的緩存機制:隻加載一屏的布局,之後滑動出來的item使用的是之前已經加載的布局的緩存;
而使用靜态的ViewHoulder的目的則是節省了findViewById的時間。如果不使用ViewHolder,每次getView的時候都需要得到一次子布局,而這也是很耗時并且耗資源的;如果使用了ViewHolder作為子布局的緩存,使用View的setTag方法将緩存與每個item綁定,則也可以省去了findViewById的事件;而将ViewHolder設定為static的目的是指在初始化Adapter時初始化一次這個内部類,否則将會在每次建立Adapter時都要初始化一次,而這是沒有必要的。
3:Android中dip、dp、sp、pt和px的差別
dip: device independent pixels(裝置獨立像素). 不同裝置有不同的顯示效果,這個和裝置硬體有關,一般我們為了支援WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
dp: dip是一樣的
px: pixels(像素). 不同裝置顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。
pt: point,是一個标準的長度機關,1pt=1/72英寸,用于印刷業,非常簡單易用;
sp: scaled pixels(放大像素). 主要用于字型顯示best for textsize。
據px = dip * density / 160,則當螢幕密度為160時,px = dip
根據 google 的建議,TextView 的字号最好使用 sp 做機關,而且檢視TextView的源碼可知Android預設使用sp作為字号機關。将dip作為其他元素的機關。
url:http://greatverve.cnblogs.com/archive/2011/12/27/Android-dip-dp-sp-pt-px.html
4:java構造函數能否被繼承,為什麼?
不能,因為子類繼承父類的時候,先運作父類構造函數;具體的說就是運作父類時就會先“調用”父類的構造函數,注意“調用”和繼承不是一個含義,實質上是“自動運作”。
繼承(extends)的含義其實是“擴充”,子類完全沒必要擴充父類的構造函數,因為反正每次調子類的時候都會“自動運作”它父類的構造函數,如果真的需要子類構造函數特殊的形式,子類直接修改或重載自己的構造函數就好了。
估計是你對“構造函數”的意義本身不了解,“調用”一個類有“繼承”和“組合(說白了new 一個類)”兩種方式,當你“調用”一個類的時候就會“自動運作”它的“構造函數”。
這樣了解更好
class Person{
Person() {
System.out.println("父類構造函數");
}
Person(int a) {
System.out.println("帶參數的父類構造函數");
}
}
public class Test extends Person {
public Test() {
System.out.println("子類構造函數");
}
public Test(int a) {
Person(12);//錯誤吧 隻能用super(12)吧,如果能繼承的話就應該可以寫成Person(12); System.out.println("帶參數的子類構造函數");
}
public static void main(String[] args) {
Test a=new Test(12);
}
}