1.JSONObject是Android原生的json類,通過import org.json.JSONObject來導(dǎo)入。
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的汕城網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
JsonObject需要添加gson jar包,通過com.google.gson.JsonObject來導(dǎo)入。
2.查看源碼,可以看到
JSONObject通過HashMap來保存鍵值對。
JsonObject使用LinkedTreeMap來保存鍵值對。
3.JSONObject:添加value為null的鍵值對,Map保存的時候會刪掉這一鍵值對;
JsonObject:添加value為null的鍵值對,Map會保留value值是null的鍵值對。
一、activity
1.一個activity就是一個類,繼承activity;
2.需要復(fù)寫onCreate()方法;
3.每一個activity都需要在AndroidMainfest.xml清單上進(jìn)行配置;
4.為activity添加必要的控件。
二、布局
線性布局:LinearLayout
1.填滿父空間:fill_parent、match_parent
2.文本多大空間就有多大:warp_content
3.文字對齊方式:gravity
4.占屏幕的比例:layout_weight="1" ?水平方向,則width=0,垂直方向,則height=0
5.一行顯示,空間不夠會省略:singleLine="ture"? false會換行
6.背景:background="#ffffff"
7.水平布局:orientation="horizontal"
垂直布局:orientation="vertivcal"
表格布局:TableLayout
1.內(nèi)邊距:padding
2.外邊距:marginLeft\Start、Right\End、Top、Bottom
三、RelativeLayout相對布局
layout_above 將該控件的底部置于給定ID控件之上
layout_below 將該控件的頂部置于給定ID控件之下
layout_toLeftOf 將該控件的右邊緣和給定ID控件的左邊緣對齊
layout_toRightOf 將該控件的左邊緣和給定ID控件的右邊緣對齊
layout_alignBaseline 該控件的baseline和給定ID的控件的Baseline對齊
layout_alignBottom 該控件的底部邊緣和給定ID的控件的底部邊緣對齊
layout_alignLeft 該控件的左邊緣和給定ID的控件的左邊緣對齊
layout_alignRight 該控件的右邊緣和給定ID的控件的右邊緣對齊
layout_alignTop 該控件的頂部邊緣和給定ID的控件的頂部邊緣對齊
layout_alignparentBottom 如果該值為true,則該控件的底部和父控件的底部對齊layout_alignParentLeft 如果該值為true,則該控件的左邊和父控件的左邊對齊
layout_alignParentRight 如果該值為true,則該控件的右邊和父控件的右邊對齊
layout_alignParentTop 如果該值為true,則該控件的上邊和父控件的上邊對齊
layout_centerHorizontal 如果該值為true,則該控件將被置于水平方向的中央
layout_centerInParent 如果該值為true,則該控件將被置于父控件水平和垂直方向的中央
layout_centerVertival 如果該值為true,則該控件將被置于垂直方向的中央
四、一個Intent對象包含一組信息
1.Component name
2.Action
3.Data
4.Category
5.Extras
6.Flags
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);? //startActivity方法
intent.putExtra("Key", "Value");? //鍵值對
intent = getIntent();
String value = intent.getStringExtra("Key");? ? //通過鍵提取數(shù)據(jù)
五、初級控件:EditText、TextView、Button
1.獲取EditText的值
String value = EditText.getText().toString();
2.將值放到Intent對象中
Intent intent = new Intent();
intent.putExtra("one",value )
intent.setCalss(Activity.this, OtherActivity.class);
3.使用這個Intent對象來啟動Otheractivity
Activity.this.startActivity(intent);
4.將監(jiān)聽器的對象綁定到按鈕對象上
button.setOnclickListener(new Listener());
5.得到Intent對象當(dāng)中的值
Intent intent = getIntent();
String value1 = intent.getStringExtra("one");
int value2 = Integer.parseInt(value);
六、其他初級控件使用
①ImageView
②RadioGroup和RadioButton
setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener())
③Checkbox
setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener())
④Menu
1.當(dāng)客戶點(diǎn)擊MENU按鈕的時候,調(diào)用onCreateOptionMenu()方法
public boolean onCreateOptionMenu(Menu menu){
menu.add(0,1,1,R.string.id);
}
2.當(dāng)客戶點(diǎn)擊MENU內(nèi)部的具體某一個選項(xiàng)時,調(diào)用onOptionItemSelected()方法
public boolean onOptionItemSelected(MenuItem item){
if(item.getItemId() == 1){
finish();
}
return super.onOptionItemSelected(item);
}
七、Activity的生命周期
1.第一次創(chuàng)建時調(diào)用
protected void onCreat(Bundle saveInstanceState);
2.顯示出來時調(diào)用
protected void onStrat();
3.獲得用戶焦點(diǎn)時調(diào)用(可操作)
protected void onResume();
4.點(diǎn)擊彈出第二個Activity時調(diào)用
protected void onPause();
5.當(dāng)?shù)谝粋€Activity不可見時調(diào)用
protected void onStop();
6.當(dāng)返回第一個Activity時調(diào)用,代替OnCreate,因?yàn)闆]被銷毀
protected void onRestart();
7.當(dāng)返回第一個Activity時調(diào)用(先執(zhí)行onStop,在執(zhí)行,因?yàn)榈诙€Activity被銷毀,不能返回獲取,只能通過onCreat,onStart,onResume再創(chuàng)建)
protected void onDestory();
八、Task
1.Task是存放Activity的Stack棧。當(dāng)點(diǎn)擊啟動第二個Activiry時,第一個Activtiy會被壓入Stack棧當(dāng)中,第二個Activity會位于棧的頂部;當(dāng)返回第一個Activtiy時,第二個Activity會被彈出Stack,第一個Activity會位于棧的頂部,以此類推。
注釋:當(dāng)調(diào)用finish()時,當(dāng)前的Activity會被Destory掉,棧中的Activity會消失。
2.當(dāng)Activity都從Stack退出后,則就不存在Task。
九、高級控件
①進(jìn)度條ProgressBar
水平進(jìn)度條style="?android:attr/progressBarStyleHorizontal"
圓圈進(jìn)度條style="?android:attr/progressBarStyle"
用戶可視的visibility="gone"
②列表ListView
十、其他控件
A.下拉菜單Spinner
1.創(chuàng)建一個ArrayAdapter:
ArrayAdapterCharSequence adapter = ArrayAdapter.createFromResource(
this, //指上下文對象
R.array.plant_array, //引用了在文件中定義的String數(shù)組
android.R.layout.simple_spinner_item);//用來指定Spinner的樣式,可替換自定義
adapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);//設(shè)置Spinner當(dāng)中每個條目的樣式
2.得到Spinner對象,并設(shè)置數(shù)據(jù):
spinner=(spinner)findViewById(R.id.spinnerId);
spinner.setAdapter(adapter);
spinner.setPrompt("測試");//標(biāo)題
3.創(chuàng)建監(jiān)聽器
class SpinnerOnSelectListener implements OnItemSelectedListener{
@override
public void onItemSelected(
AdapterView? adapterView,//整個列表對象
View view,//被選中的具體條目對象
int position,//位置
long id){ //id
String selected = adapterView.getItemAtPosition(position).toString();
}
@override
public void onNothingSelected(AdapterView? adapterView){
S.o.p("nothingSelected");
}
}
4.綁定監(jiān)聽器
spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());
注:第二種動態(tài)設(shè)計
1.創(chuàng)建ArrayList對象
ListString list = new ArrayListString();
list.add("test1");
2. 調(diào)用方法
ArrayAdapter adapter = new ArrayAdapter(
this, //指上下文對象
R.layout.item, //引用了指定了下拉菜單的自定義布局文件
R.id.textViewId,//id
list);//數(shù)據(jù)
3.得到Spinner對象,并設(shè)置對象
spinner.setAdapter(adapter);
spinner.setPrompt("測試");//標(biāo)題
3.創(chuàng)建監(jiān)聽器
class SpinnerOnSelectListener implements OnItemSelectedListener{
@override
public void onItemSelected(
AdapterView? adapterView,//整個列表對象
View view,//被選中的具體條目對象
int position,//位置
long id){ //id
String selected = adapterView.getItemAtPosition(position).toString();
}
@override
public void onNothingSelected(AdapterView? adapterView){
S.o.p("nothingSelected");
}
}
4.綁定監(jiān)聽器
spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());
B.DatePicker和DatePickerDialog
1.聲明一個監(jiān)聽器,使用匿名內(nèi)部類
DatePickerDialog.OnDateSetListener onDateSetListener
= new DatePivkerDialog.OnDateSetListener(){
public void onDateSet(
DatePicker view,
int year,
int monthOfYear,
int dayOfMonth){
S.o.p(year+"-"+motnOfYear+"-"+dayOfMonth)
}
}
2.復(fù)寫onCreateDialog(int id)方法:
@override
protected Dialog onCreateDialog(int id){
switch(id){
case DATE_PICKER_ID:
return new DatePickerDialog(this,onDateSetListener,2019,11,25);
}
return null;
}
3.使用時調(diào)用showDialog()方法
showDialog(DATE_PICKER_ID);
C.AutoCompleteTextView
B.Widget
C.Animatin
十一、實(shí)現(xiàn)ContentProvider過程
1.定義一個CONTENT_URI常量
2.定義一個類,繼承ContentProvider
3.實(shí)現(xiàn)query、insert、update、delete、getType和onCreate方法
4.在AndroidManifest.xml當(dāng)中進(jìn)行聲明
假設(shè)準(zhǔn)備好的xml是
string-array name="names"
item shanghai/item
item beijing/item
item hongkong/item
/string-array
string-array name="values"
item 021/item
item 010/item
item 00852/item
/string-array
假設(shè)要獲得 "shanghai"對應(yīng)的值,可以參考以下函數(shù):
public String getAreaCode(String cityName) {
String[] names = getResources().getStringArray(R.array.names);
String[] values = getResources().getStringArray(R.array.values);
for (int i = 0; i names.length; i++) {
if (names[i].equals(cityName)) {
return values[i];
}
}
return null;
}
數(shù)據(jù)存儲在開發(fā)中是使用最頻繁的,Android平臺主要有5種實(shí)現(xiàn)數(shù)據(jù)存儲的方式。
第1種: 使用SharedPreferences存儲數(shù)據(jù)
SharedPreferences是Android平臺上一個輕量級的存儲類,主要是保存一些常用的配置比如窗口狀態(tài),一般在Activity中 重載窗口狀態(tài)onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平臺常規(guī)的Long長 整形、Int整形、String字符串型的保存。
它的本質(zhì)是基于XML文件存儲key-value鍵值對數(shù)據(jù),通常用來存儲一些簡單的配置信息。
其存儲位置在/data/data/包名/shared_prefs目錄下。
SharedPreferences對象本身只能獲取數(shù)據(jù)而不支持存儲和修改,存儲修改是通過Editor對象實(shí)現(xiàn)。
實(shí)現(xiàn)SharedPreferences存儲的步驟如下:
一、根據(jù)Context獲取SharedPreferences對象
二、利用edit()方法獲取Editor對象。
三、通過Editor對象存儲key-value鍵值對數(shù)據(jù)。
四、通過commit()方法提交數(shù)據(jù)。
SharedPreferences對象與SQLite數(shù)據(jù)庫相比,免去了創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數(shù)據(jù)類型,比如其無法進(jìn)行條件查詢等。所以不論SharedPreferences的數(shù)據(jù)存儲操作是如何簡單,它也只能是存儲方式的一種補(bǔ)充,而無法完全替代如SQLite數(shù)據(jù)庫這樣的其他數(shù)據(jù)存儲方式。
1、存儲方式不同
HashMap內(nèi)部有一個HashMapEntryK, V[]對象,每一個鍵值對都存儲在這個對象里,當(dāng)使用put方法添加鍵值對時,就會new一個HashMapEntry對象,具體實(shí)現(xiàn)如下:
[java] view plaincopy
@Override public V put(K key, V value) {
if (key == null) {
return putValueForNullKey(value);
}
int hash = secondaryHash(key);
HashMapEntryK, V[] tab = table;
int index = hash (tab.length - 1);
//先查找有沒有對應(yīng)的key值,如果有,就改寫value,并返回改寫前的value值:oldValue
for (HashMapEntryK, V e = tab[index]; e != null; e = e.next) {
if (e.hash == hash key.equals(e.key)) {
preModify(e);
V oldValue = e.value;
e.value = value;
return oldValue;
}
}
// No entry for (non-null) key is present; create one
modCount++;
if (size++ threshold) {
//擴(kuò)容,雙倍
tab = doubleCapacity();
index = hash (tab.length - 1);
}
addNewEntry(key, value, hash, index);
return null;
}
//創(chuàng)建對象存儲鍵值對
void addNewEntry(K key, V value, int hash, int index) {
table[index] = new HashMapEntryK, V(key, value, hash, table[index]);
}
ArrayMap的存儲中沒有Entry這個東西,他是由兩個數(shù)組來維護(hù)的
[java] view plaincopy
int[] mHashes;
Object[] mArray;
mHashes數(shù)組中保存的是每一項(xiàng)的HashCode值,mArray中就是鍵值對,每兩個元素代表一個鍵值對,前面保存key,后面的保存value,我們看看下面代碼的結(jié)果:
[java] view plaincopy
arraymap = new HashMapString, String();
a.put("a", "a_value");
a.put("b", "b_value");
執(zhí)行上面代碼后,arraymap中的存儲是這樣的
是不是能清楚地看到ArrayMap的存儲了,這種存儲在put代碼中如下:
[java] view plaincopy
mHashes[index] = hash;
mArray[index1] = key;
mArray[(index1)+1] = value;
2、添加數(shù)據(jù)時擴(kuò)容時的處理不一樣
先來看看HashMap
[java] view plaincopy
if (size++ threshold) {
tab = doubleCapacity();
index = hash (tab.length - 1);
}
doubleCapacity進(jìn)行雙倍擴(kuò)容,它的代碼中有這么一句話
[java] view plaincopy
HashMapEntryK, V[] newTable = makeTable(newCapacity);
最終,這個newTable將作為擴(kuò)容后的新對象返回,那么makeTable做了什么呢,如下:
[java] view plaincopy
private HashMapEntryK, V[] makeTable(int newCapacity) {
@SuppressWarnings("unchecked") HashMapEntryK, V[] newTable
= (HashMapEntryK, V[]) new HashMapEntry[newCapacity];
table = newTable;
threshold = (newCapacity 1) + (newCapacity 2); // 3/4 capacity
return newTable;
}
我們清楚地看到,這里進(jìn)行了new操作,重新創(chuàng)建對象,開銷很大。
那么ArrayMap呢,看看:
[java] view plaincopy
//如果容量不夠
ize = mHashes.length) {
final int n = mSize = (BASE_SIZE*2) ? (mSize+(mSize1))
: (mSize = BASE_SIZE ? (BASE_SIZE*2) : BASE_SIZE);
if (DEBUG) Log.d(TAG, "put: grow from " + mHashes.length + " to " + n);
final int[] ohashes = mHashes;
final Object[] oarray = mArray;
//分配數(shù)組
allocArrays(n);
if (mHashes.length 0) {
if (DEBUG) Log.d(TAG, "put: copy 0-" + mSize + " to 0");
//特別注意這,是copy,而不是new,效率提升
System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
System.arraycopy(oarray, 0, mArray, 0, oarray.length);
}
//釋放無用空間,收縮數(shù)組
freeArrays(ohashes, oarray, mSize);
}
ArrayMap用的是copy數(shù)據(jù),所以效率相對要高。
3、ArrayMap提供了數(shù)組收縮的功能,在clear或remove后,會重新收縮數(shù)組,是否空間
4、ArrayMap采用二分法查找;
以上就是android開發(fā)中,HashMap與ArrayMap的區(qū)別,大家在涉及到內(nèi)存方面的實(shí)現(xiàn),可根據(jù)實(shí)際情況選擇這兩種不同的方式。
舉個實(shí)例:
[
["5","\u9760\u7a97",false,true,
[
["2","1h",false,false],
["3","2h",true,true],
["4","3h",false,false],
["5","4h",false,false],
["6","5h",false,false]]],
["4","\u65e7\u91d1\u5c71",false,false,
[
["1","\u65e7\u91d1\u5c71",false,false]
]
]
]
這樣的JSON數(shù)據(jù)不是鍵值對的格式
解決方法 : public static void downAreaTable(JsonArray jsonData) {PadUtil.areaTables = null;JsonArray array2;JsonArray array3;JsonArray array4;int len = jsonData.getAsJsonArray().size();if (len 0) {areaTables = new HashMapTable, Area();for (int i = 0; i len; i++) {array2 = jsonData.getAsJsonArray().get(i).getAsJsonArray();Area area = new Area(Integer.parseInt(array2.get(0).getAsString()), array2.get(1).getAsString(), array2.get(1).getAsString(), array2.get(2).getAsBoolean()); array3 = array2.get(4).getAsJsonArray(); for (int j = 0; j array3.size(); j++) {array4 = array3.get(j).getAsJsonArray();Table table = new Table(Integer.parseInt(array4.get(0).getAsString()), array4.get(1).getAsString(),array4.get(1).getAsString(), area, array4.get(2).getAsBoolean());areaTables.put(table, area);}}}}