隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

          關(guān)于Android中傳遞數(shù)據(jù)的一些討論

          本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

               在Android中編寫過程序的開發(fā)人員都知道。在Activity、Service等組件之間傳遞數(shù)據(jù)(尤其是復(fù)雜類型的數(shù)據(jù))很不方便。一般可以使用Intent來傳遞可序列化或簡單類型的數(shù)據(jù)。看下面的代碼。

               Intent intent = new Intent(this, Test.class);
               intent.putExtra(
          "param1""data1");
               intent.putExtra(
          "intParam1"20);
               startActivity(intent);

               這樣就ok了。在當前Activity將兩個值傳到了Test中。但如果遇到不可序列化的數(shù)據(jù),如Bitmap、InputStream等,intent就無能為力了。因此,我們很自然地會想到另外一種方法,靜態(tài)變量。如下面的代碼所示:

             public class Product extends Activity
             {
                  
          public static Bitmap mBitmap;
                  
             }

              對于上面的代碼來說,其他任何類可以直接使用Product中的mBitmap變量。這么做很easy、也很cool,但卻very very wrong。我們千萬不要以為Davlik虛擬機的垃圾回收器會幫助我們回收不需要的內(nèi)存垃圾。事實上,回收器并不可靠,尤其是手機上,是更加的不可靠。因此,除非我們要使自己的程序變得越來越糟糕,否則盡量遠離static。

          注:如果經(jīng)常使用static的Bitmap、Drawable等變量。可能就會拋出一個在Android系統(tǒng)中非常著名的異常(以前budget這個單詞一直記不住什么意思,自從經(jīng)常拋出這個異常后,這個單詞終于爛熟于心了,

          ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget


              如果不使用static,總得有方法來代替它(盡管我很喜歡public static,我相信很多人也喜歡它,但為了我們的程序,建議還是忍痛割愛吧),那么這個新的解決方案就是本文的主題,這就是Application Context,相當于Web程序的Application,它的生命周期和應(yīng)用程序一樣長(這個我喜歡)。

              那么現(xiàn)在來看看如何使用這個Application Context。我們可以通過Context.getApplicationContext或Context.getApplication方法獲得Application Context。但要注意,我們獲得的只是Context對象,而更理想的方法是獲得一個類的對象。ok,說干就干,下面來定義一個類。

          package net.blogjava.mobile1;

          import android.app.Application;
          import android.graphics.Bitmap;

          public class MyApp extends Application
          {
              
          private Bitmap mBitmap;

              
          public Bitmap getBitmap()
              {
                  
          return mBitmap;
              }

              
          public void setBitmap(Bitmap bitmap)
              {
                  
          this.mBitmap = bitmap;
              }
              
          }

              上面這個類和普通的類沒什么本質(zhì)的不同。但該類是Application的子類。對了,這就是使用Application Context的第一步,定義一個繼承自Application的類。然后呢,就在這個類中定義任何我們想使其全局存在的變量了,如本例中的Bitmap。下面還需要一個重要的步驟,就是在<application>標簽中使用android:name屬性來指定這個類,代碼如下:

          <application android:name=".MyApp" android:icon="@drawable/icon" android:label="@string/app_name">

          </application?

              接下來的最后一步就是向MyApp對象中存入Bitmap對象,或從MyApp對象中取出Bitmap對象了,存入Bitmap對象的代碼如下:

              MyApp myApp = (MyApp)getApplication();
                  
              Bitmap bitmap 
          = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon);
                  
              myApp.setBitmap(bitmap);

              獲得Bitmap對象的代碼:
              ImageView imageview = (ImageView)findViewById(R.id.ivImageView);
                  
              MyApp myApp 
          = (MyApp)getApplication();
                  
              imageview.setImageBitmap(myApp.getBitmap());
             
              上面兩段代碼可以在任何的Service、Activity中使用。全局的,哈哈。




          Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2010-11-09 16:25 銀河使者 閱讀(5355) 評論(1)  編輯  收藏 所屬分類: java 原創(chuàng)GoogleAndroid/OPhone

          評論

          # re: 關(guān)于Android中傳遞數(shù)據(jù)的一些討論  回復(fù)  更多評論   

          原來總是使用static是不好的習(xí)慣
          2012-03-10 12:29 | yangqinjiang
          主站蜘蛛池模板: 侯马市| 富裕县| 合江县| 凤翔县| 拉萨市| 铜山县| 揭西县| 广西| 新蔡县| 本溪市| 南昌县| 姜堰市| 怀宁县| 夏津县| 常德市| 罗山县| 虎林市| 如皋市| 成安县| 开远市| 田东县| 云和县| 元阳县| 石狮市| 永宁县| 巩义市| 玉龙| 远安县| 鹿泉市| 桂平市| 大名县| 扎兰屯市| 元谋县| 塔河县| 巨野县| 中山市| 正安县| 且末县| 托克逊县| 丰镇市| 阿尔山市|