您的位置:首页 > 移动开发 > Android开发

关于Android中传递数据的一些讨论

2010-11-10 08:49 519 查看

[b][b][b][b][b][b][b][b][b][b][b][b][b][b][b]本文为原创,如需转载,请注明作者和出处,谢谢!
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]

在Android中编写过程序的开发人员都知道。在Activity、Service等组件之间传递数据(尤其是复杂类型的数据)很不方便。一般可以使用Intent来传递可序列化或简单类型的数据。看下面的代码。

Intent intent
=
new
Intent(
this
, Test.
class
);

intent.putExtra(
"
param1
"
,
"
data1
"
);

intent.putExtra(
"
intParam1
"
,
20
);

startActivity(intent);





这样就ok了。在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据,如Bitmap、InputStream等,intent就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示:


public
class
Product
extends
Activity

{


public
static
Bitmap mBitmap;






}





对于上面的代码来说,其他任何类可以直接使用Product中的mBitmap变量。这么做很easy、也很cool,但却very very

wrong。我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上,回收器并不可靠,尤其是手机上,是更加的不可靠。
因此,除非我们要使自己的程序变得越来越糟糕,否则尽量远离static。



注:如果经常使用static的Bitmap、Drawable等变量。可能就会抛出一个在Android系统中非常著名的异常(以前budget这个单词一直记不住什么意思,自从经常抛出这个异常后,这个单词终于烂熟于心了,






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






如果不使用static,总得有方法来代替它(尽管我很喜欢public
static,我相信很多人也喜欢它,但为了我们的程序,建议还是忍痛割爱吧),那么这个新的解决方案就是本文的主题,这就是Application
Context,相当于Web程序的Application,它的生命周期和应用程序一样长(这个我喜欢)。




那么现在来看看如何使用这个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;

}



}





上面这个类和普通的类没什么本质的不同。但该类是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中使用。全局的,哈哈。





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


华章培训网视频教程:实现Android版的多功能日历



《Android/OPhone开发完全讲义》(本书版权已输出到台湾)



样章和目录下载



互动网

当当网

卓越亚马逊



《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》


script.txt文件下载

样章下载

互动网
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: