天天看點

Activity之間傳遞大資料問題 Bitmap

android開發人員都知道,intent适用于在不同的activity之間傳遞資料,包括參數、字元串、以及序列化的對象等。但是筆者所做的項目用到了使用intent 傳遞bitmap圖檔對象,圖檔的資料量相對來說是比較大的,那麼intent能否勝任傳遞圖檔的任務呢?

首先很明顯bitmap實作了android中的parcelable接口,可以序列化。是以理所當然能夠通過intent傳遞,然而圖檔的大小有沒有限制呢?

答案是肯定的,intent在傳遞資料時是有大小限制的,這裡官方并未詳細說明,不過通過實驗的方法可以測出資料應該被限制在1mb之内(1024kb),筆者采用的是傳遞bitmap的方法,發現當圖檔大小超過1024(準确地說是1020左右)的時候,程式就會出現閃退、停止運作等異常(不同的手機反應不同),是以可以判斷intent的傳輸容量在1mb之内。

在activity或者元件之前傳遞資訊時,一般采用intent綁定bundle的方式傳值,但在使用過程中需要注意的是不要用bundle傳遞大容量資料:

傳輸一般的資料參數不會用到這麼大的資料量,是以intent符合除圖檔之外的大部分使用場景,請放心使用吧。如果想傳遞圖檔那麼建議使用其他方式,附錄裡提供了三種傳遞圖檔的方式。

下面談談我們如何通過intent元件傳遞大資料

傳遞小的bitmap對象

1。mainactivity中包括一個imageview;當我們點選imageview時;把圖檔傳遞給另外一個activity

  mainactivity的主要代碼:

intent intent=new intent(mainactivity.this,tranactivity.class);

            intent.putextra("bitmap", bitmap);

            startactivity(intent);

  biitmap是 在oncreate方法中獲得的圖檔對象 bitmap=bitmapfactory.decoderesource(getresources(), r.drawable.ic_launcher);

我們點選圖檔的時候,跳轉到tranactivity中;并且傳遞一個bitmap作為參數

而對于比較大的資料傳遞(筆者實驗最好不要超過1m),解決的方法如下:

方法一:将需要傳遞的資料寫在臨時檔案或者資料庫中,再跳轉到另外一個元件的時候再去讀取這些資料資訊,這種處理方式會由于讀寫檔案較為耗時導緻程式運作效率較低;

方法二:将需要傳遞的資料資訊封裝在一個靜态的類中(注意目前元件和要跳轉到的元件必須屬于同一個程序,因為程序之間才能夠共享資料),在目前元件中為類設定内容,然後再跳轉到的元件中去取,這種處理方式效率很高,但是會破壞程式的獨立性。

最後附上傳遞圖檔的一些建議:

附1:android中傳遞圖檔的三種方式:

1. 如果是本地res中的資源檔案可以用intent.putextra("id", r.id.xxx);傳遞一個對應的id過去。在新activity中通過id取出圖檔。getresources().getdrawable(r.id.xxx);

2. 如果不是本地資源檔案或者adapter中沒有存儲id,可以把drawable轉為bitmap,用intent.putextra("bitmap", bitmap);傳遞過去。因為intent隻能傳遞實作序列化的類,即繼承java 的serializable接口或者android的parcelable接口。drawable沒有實作該接口是以不能傳遞。

3. 如果是通過線程什麼的從網上拉取的圖檔,可以定義一個下載下傳的工具類,并定義一個static的靜态map集合,每拉取成功一張圖檔就把該圖檔存入map中作為緩存。key是該圖檔的拉取位址。然後通過intent把位址傳遞過去。在新activity中通過該工具類取得靜态map,并通過傳遞過來的位址中map中取出該圖檔。

附2:android中擷取bitmap尺寸的方法

在不同的api版本中該方法的實作方式不一樣,總的來說可以使用一下方法分别适用于api19、api12和更早的api。獲得資料的機關是位元組,自行轉化為kb或mb。

public int getbitmapsize(bitmap bitmap){  

    if (build.version.sdk_int >= build.version_codes.kitkat){    //api 19  

        return bitmap.getallocationbytecount();  

    }  

    if (build.version.sdk_int >= build.version_codes.honeycomb_mr1){//api 12  

        return bitmap.getbytecount();  

    return bitmap.getrowbytes() * bitmap.getheight();                //earlier version  

}  

繼續閱讀