1. 程式人生 > >Activity之間傳遞大資料問題

Activity之間傳遞大資料問題

Android開發人員都知道,Intent適用於在不同的Activity之間傳遞資料,包括引數、字串、以及序列化的物件等。但是筆者所做的專案用到了使用Intent 傳遞Bitmap圖片物件,圖片的資料量相對來說是比較大的,那麼intent能否勝任傳遞圖片的任務呢?

首先很明顯bitmap實現了Android中的Parcelable介面,可以序列化。因此理所當然能夠通過intent傳遞,然而圖片的大小有沒有限制呢?

Bitmap

extends Object
implements Parcelable

答案是肯定的,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。

  1. publicint getBitmapSize(Bitmap bitmap){  
  2.     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){    //API 19
  3.         return bitmap.getAllocationByteCount();  
  4.     }  
  5.     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1){//API 12
  6.         return bitmap.getByteCount();  
  7.     }  
  8.     return bitmap.getRowBytes() * bitmap.getHeight();                //earlier version
  9. }  

相關推薦

Activity之間傳遞資料問題

Android開發人員都知道,Intent適用於在不同的Activity之間傳遞資料,包括引數、字串、以及序列化的物件等。但是筆者所做的專案用到了使用Intent 傳遞Bitmap圖片物件,圖片的資料量相對來說是比較大的,那麼intent能否勝任傳遞圖片的任務呢? 首先很明

兩個Activity之間傳遞List資料

一、List<T>的Bean物件,Bean類實現Serializable介面 public class WordReview implements Serializable {

關於Android Activity之間傳遞資料的6種方式

使用Inten的putExtra傳遞 第一個Activity中 ? 1 2 3 4 5 6 //建立意圖物件  Intent intent = new Intent(this,TwoActivity.class);  //設定傳

Activity之間傳遞資料的方式及常見問題總結

Activity之間傳遞資料一般通過以下幾種方式實現: 通過intent傳遞資料 通過Application 使用單例 靜態成員變數。(可以考慮 WeakReferences) 持久化(sqlite、share preference、file等)

Android Intent傳值(兩個Activity之間傳遞資料

在兩個Activity之間傳遞資料,最終都是通過Intent傳遞,但設定資料和儲存資料方式有兩種(使用Intent 和 Bundle),分別對應如下: 設定資料(MainActivity.java) 方法一:1.直接用intent.putExtra(“name”,“張三”)

Android 學習之路一:Activity之間傳遞資料的四種方式

傳遞資料 新建 Activity 在專案中右鍵,選擇 New,繼續選擇中下方的 Activity,最後是 Blank Activity。 此時 Android Studio 會為我們自動新增一個對應的佈局檔案,為佈局檔案中的 TextView 新增 I

Android 兩個Activity之間傳遞資料及返回

從Activity1帶引數跳轉到Activity2這個經常用到,比較熟悉,但如何從Activity2將資料返回給Activity1呢?這個其實也不麻煩,動手敲一下就知道了。 Activity1程式碼:public class MainActivity extends A

Android基礎 -- Activity之間傳遞資料(bitmap和map物件)

這邊文章很古老了,看到還有朋友回覆,這裡更新幾點,避免誤導大家。 第一,傳遞HashMap物件  HashMap本身已經實現了Cloneable, Serializable,Intent傳遞時,直接強轉就可以了。(感謝@qcks指正) Map<String, St

【Android 開發】 : Activity之間傳遞資料的幾種方式

在Android開發中,我們通常需要在不同的Activity之間傳遞資料,下面我們就來總結一下在Activity之間資料傳遞的幾種方式。 1. 使用Intent來傳遞資料 Intent表示意圖,很多時候我們都會利用Android的Intent來在各個A

兩個Activity之間傳遞資料的全部方法以及Parcelable介面的用法

兩個Activity之間是通過Intent來完成跳轉的: Intent除了完成跳轉Activity之外還可以封裝資料.在這兩個Activity中,如果傳遞單一的資料,直接把資料封裝進Intent即可: 方法一: 直接把資料封裝進Intent即可: Acti

【Android基礎】利用Intent在Activity之間傳遞數據

一次 there center ack and block for success display 前言: 上一篇文章給大家聊了Intent的使用方法。怎樣用Intent啟動Activity和隱式Intent。這一篇文章給大家聊聊怎樣利用Intent在Activit

Android之Activity之間傳遞對象

this .get tin 方式 art desc 內容 ext pri 在非常多時候,我們須要在Activity之間傳遞對象,比方當你點擊了某列表的item,須要傳遞給下一個Activity該對象,那我們須要該怎麽做呢? Android支持兩種傳遞對象的方式。一種

JQuery與一般處理程式之間傳遞JSON資料

前端 HtmlPage1.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type"

《android studio3》在多個activity之間傳遞引數

z.B:啟動一個特定的Activity Intent intent=new Intent(CurrentActivity.this,OtherActivity.class); startActivity(intent); 如果想要傳遞Pra的話,就是i.put...在自動跳出的備選中選擇,有很多型別

Android:Activity之間傳遞引數並跳轉

當前頁面傳出引數: public void First(View v){ //新建一個顯式意圖,第一個引數為當前Activity類物件,第二個引數為你要開啟的Activity類 Intent intent =new Intent(FirstActivity

Activity之間傳遞引數(一)

-------siwuxie095 傳遞簡單資料 (1)首先建立一個專案:SendArgs (2)選擇API:21 Android 5.0 (3)選擇Empty Activity

JavaBinder: !!! FAILED BINDER TRANSACTION !!! intent傳遞資料異常解決

    在使用intent傳遞集合資料的時候,報了JavaBinder: !!! FAILED BINDER TRANSACTION !!! 錯誤,翻譯成中文就是“繫結器事務失敗”,實際的原因就是使用intent的時候攜帶的資料太大導致傳遞失敗。    

activity之間傳遞handler(二)

如果把handler定義為static,它的子成員變數和子方法都要是static屬性。一旦activity接收到handler,要處理的事件變多,則大量的變數和函式都成為static型別了,這樣非常不利於程式碼的獨立性和隱私性。這是我在研究安卓系統藍芽通訊技

Android 的 Activity 之間傳遞物件引用的方法

傳統的傳遞資料一般用 intent.putExtras 之類的 不過要傳遞引用就不能這樣了 雖然貌似不提倡傳遞引用,因為Activity的生存週期的原因 不過如果傳遞的執行緒物件 或者其他的一些情況,可能還是會有這種 傳遞引用的需求 我的解決方法是: 在Activity

jdbc+struts axis 傳遞資料

使用list集合轉換成json的方式,用到的json    jar包 commons-beanutils-1.8.0.jar不加這個包  java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBe