中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android之旅十三 android中的數據傳遞方法

發布時間:2020-07-10 10:33:37 來源:網絡 閱讀:743 作者:HarderXin 欄目:移動開發

  android開發中,我們的Activity之間總避免不了進行數據的傳遞,幾種傳遞方式大致如下,各有各的用處:

1、Intent攜帶簡單的數據

Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putString("username","Mary");
bundle.putInt("age",23);
intent.putExtras(bundle);

 參數接收:

Bundle bundle=getIntent().getExtras(); 
String username=bundle.getString("username"); 
int age=bundle.getInt("age");


2、Intent攜帶例如ArrayList之類復雜的數據
 注意:在傳參數前,要用新增加一個List將對象包起來
 初始化數據:

Map<String,String> map=new HashMap<String,String>(); 
map.put("aaa","hello"); 
map.put("bbb","world"); 
List<Map<String,String>> list=new ArrayList<Map<String,String>>(); 
list.add(map); 
                                                                 
Intent intent=new Intent(); 
Bundle bundle=new Bundle(); 
//須定義一個list用于在bundle中傳遞需要傳遞的List<Object>,這個是必須要的 
ArrayList bundleList=new ArrayList(); 
bundleList.add(list); 
                                                                 
bundle.putParcelableArrayList("list",bundleList); 
intent.putExtras(bundle);

參數接收:

Bundle bundle=getIntent().getExtras(); 
List bundleList=bundle.getParcelbleArrayList("list"); 
List<Map<String,String>> list=(List<Map<String,String>>)bundleList.get(0); 
//遍歷輸出


3、通過實現Serializable接口傳遞參數
 初始化數據:

Map<String,String> map=new HashMap<String,String>(); 
map.put("aaa","hello"); 
map.put("bbb","world"); 
                                                             
Bundle bundle=new Bundle(); 
bundle.putSerializable("map",map); 
Intent intent=new Intent(); 
intent.putExtras(bundle);


參數接收:

Bundle bundle=getIntent().getExtras(); 
//HashMap沒問題 
//LinkedHashMap,轉換時會拋出ClassCastException,何解 
Map<String,String> map=(Map<String,String>)bundle.getSerializable("map"); 
//遍歷輸出 


4、通過實現Parcelable接口,把要傳的數據打包在里面,然后在接收端自己分解出來。這個是Android獨有的,在其本身的源碼中也用得很多,效率要比Serializable相對要好。

Parcelable實現要點:需要實現三個東西

1)writeToParcel 方法。該方法將類的數據寫入外部提供的Parcel中.聲明如下:

writeToParcel (Parcel dest, int flags) 具體參數含義見javadoc

2)describeContents方法。沒搞懂有什么用,反正直接返回0也可以

3)靜態的Parcelable.Creator接口,本接口有兩個方法:

createFromParcel(Parcel in) 實現從in中創建出類的實例的功能

newArray(int size) 創建一個類型為T,長度為size的數組,僅一句話(return new T[size])即可。估計本方法是供外部類反序列化本類數組使用。

定義一個DataParcelable實現Parcelable接口,將要傳輸的數據定義在這個類里面:

package com.xin.activity; 
                                                       
import java.util.HashMap; 
import java.util.Map; 
                                                       
import android.os.Parcel; 
import android.os.Parcelable; 
                                                       
public class DataParcelable implements Parcelable{ 
    //定義要被傳輸的數據 
    public int age; 
    public String username; 
    public String password; 
    public Map<String,String> map=new HashMap<String,String>(); 
                                                       
    @Override 
    public int describeContents() { 
        return 0; 
    } 
                                                       
    /**
     * 類的數據寫入外部提供的Parcel
     */ 
    @Override 
    public void writeToParcel(Parcel out, int flags) { 
        //將數據映射到Parcel中去 
        out.writeInt(age); 
        out.writeString(username); 
        out.writeString(password); 
        out.writeMap(map); 
    } 
                                                           
    public static final Parcelable.Creator<DataParcelable> CREATOR=new Parcelable.Creator<DataParcelable>() { 
                                                       
        /**
         * 創建出類的實例
         */ 
        @SuppressWarnings("unchecked") 
        @Override 
        public DataParcelable createFromParcel(Parcel in) { 
            DataParcelable data=new DataParcelable(); 
            //將映射在Parcel對象中的數據還原出來 
            //這里的順序一定要和writeToParcel中定義的順序一致才行 
            data.age=in.readInt(); 
            data.username=in.readString(); 
            data.password=in.readString(); 
            data.map=in.readHashMap(HashMap.class.getClassLoader()); 
            return data; 
        } 
                                                       
        @Override 
        public DataParcelable[] newArray(int size) { 
            return new DataParcelable[size]; 
        } 
    }; 
}

注意上面方法中createFromParcel讀取的順序要和writeToParcel寫入的順序一致才行,這樣才能保證相同數據類型的數據能夠按順序被讀取出來!里面是這樣的一個設計機制.

初始化DataParcelable數據并將其放到Intent對象中去:

Intent intent=new Intent(MainActivity.this,OtherActivity.class); 
DataParcelable data=new DataParcelable(); 
data.age=23; 
data.username="hello"; 
data.password="world"; 
data.map=new HashMap<String,String>(); 
data.map.put("aaa","123"); 
data.map.put("bbb","456"); 
intent.putExtra("data", data); 
startActivity(intent);

讀取DataParcelable中的數據:

         Intent intent=getIntent(); 
DataParcelable data=intent.getParcelableExtra("data"); 
System.out.println("age="+data.age+",username="+data.username+",password="+data.password+",map="+data.map);
大家根據自己的需要和使用場景,選擇自己的數據存儲方式吧!!
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临湘市| 江华| 凤山县| 浑源县| 浦北县| 九江县| 江源县| 寻甸| 定安县| 永仁县| 虎林市| 托里县| 汶上县| 永胜县| 扎赉特旗| 射洪县| 肇州县| 郸城县| 汉中市| 木里| 新巴尔虎右旗| 保靖县| 罗甸县| 苍溪县| 新疆| 乾安县| 天津市| 洪洞县| 漠河县| 五家渠市| 璧山县| 湘乡市| 长兴县| 佛教| 贵阳市| 龙岩市| 阳原县| 安岳县| 西城区| 开封市| 丹凤县|