关于Android中传递数据的一些讨论--备用
在Android中编写过程序的开发人员都知道。在Activity、Service等组件之间传递数据(尤其是复杂类型的数据)很不方便。一般可以使用Intent来传递可序列化或简单类型的数据。看下面的代码。
intent.putExtra( " param1 " , " data1 " );
intent.putExtra( " intParam1 " , 20 );
startActivity(intent);
这样就ok了。在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据,如Bitmap、InputStream等,intent就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示:
{
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,说干就干,下面来定义一个类。
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?
接下来的最后一步就是向MyApp对象中存入Bitmap对象,或从MyApp对象中取出Bitmap对象了,存入Bitmap对象的代码如下:
Bitmap bitmap = BitmapFactory.decodeResource( this .getResources(), R.drawable.icon);
myApp.setBitmap(bitmap);
获得Bitmap对象的代码:
MyApp myApp = (MyApp)getApplication();
imageview.setImageBitmap(myApp.getBitmap());
上面两段代码可以在任何的Service、Activity中使用。全局的。 感谢大神分享!
关于Android中传递数据的一些讨论--备用的更多相关文章
- 关于Android中传递数据的一些讨论
在Android中编写过程序的开发人员都知道.在Activity.Service等组件之间传递数据(尤其是复杂类型的数据)很不方便.一般可以使用Intent来传递可序列化或简单类型的数据.看下面的代码 ...
- Android中的数据存储
Android中的数据存储主要分为三种基本方法: 1.利用shared preferences存储一些轻量级的键值对数据. 2.传统文件系统. 3.利用SQLite的数据库管理系统. 对SharedP ...
- 67.Android中的数据存储总结
转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d0 ...
- Android中的数据持久化机制
Android中几种最简单但是却最通用的数据持久化技术:SharedPreference.实例状态Bundle和本地文件. Android的非确定性Activity和应用程序生存期使在会话间保留UI状 ...
- ASP.NET MVC中如何以ajax的方式在View和Action中传递数据
前言:写这篇随笔的时候,在url上漏写了斜线,找了好久错误,整个人都很不好.#我是猪系列 背景:之前介绍过一篇如何构建 MVC&AJax&JSon示例,这一篇单独讲解如何在View和A ...
- Android中的数据存储(二):文件存储 2017-05-25 08:16 35人阅读 评论(0) 收藏
文件存储 这是本人(菜鸟)学习android数据存储时接触的有关文件存储的知识以及本人自己写的简单地demo,为初学者学习和使用文件存储提供一些帮助.. 如果有需要查看SharedPreference ...
- Android之间传递数据包
在Android中 ,我们知道,两个activity之间通讯要用到Intent类,传递简单数据的方式我们也已经知道了.那么,如何在两个activity之间传递数据包呢,这就要用到我们的Bundle类了 ...
- Android开发—— 传递数据
一:使用静态变量传递数据 (1)静态变量传递数据,在目标Activity中声明静态变量,然后使用setText()方法将静态变量的值导出即可: (2)静态变量传递数据,在主Activity中对目标Ac ...
- Android中传递对象的三种方法
Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者I ...
随机推荐
- 笔记本开了WIFI之后只能上QQ,上不了网页的解决方法
前几天拉了宽带之后,开了WIFI,发现WIFI能上网,但是电脑就上不了网页. 把本地连接的DNS指定一下,(电信)指定为202.102.192.68
- strcmp函数和strcpy函数
(一)strcmp函数 strcmp函数是比較两个字符串的大小,返回比較的结果.一般形式是: i=strcmp(字符串,字符串); 当中,字符串1.字符串2均可为字符串常量或变量:i 是用于存放比 ...
- SSH框架总结(框架分析+环境搭建+实例源代码下载)
首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是眼下较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...
- Android API 文档 离线秒开方法
http://blog.csdn.net/haifengzhilian/article/details/39898627 也是最近才看Android开发,但是,它的API文档无论是在线还是离线的,实在 ...
- 恭贺自己itpub和csdn双双获得专家博客称号
这是对一个技术人员行业内很难得的认可,记录下来,加油...一切向钱看,明天会更好.
- LabVIEW系列——错误簇的传递
从以下示例可以得出结论: 1.图一出现的三种错误,分别位于打开/创建/替换文件函数,写入文本文件函数,读取文件文件函数.说明三个函数都被运行了. 2.图二只出现了一种错误,位于打开/创建/替换文件函数 ...
- GUI之CCControlExtension
Introduction CCControl is inspired by the UIControl API class from the UIKit library of CocoaTouch. ...
- 升级mac的java版本
在OS X EI Capitan下, java版本太低,从oracle官网下载的dmg文件升级一直有问题, 我发现mac下的java环境有三处 #这应该是系统自带java环境,默认/usr/bin/j ...
- PHP 支持的协议/封装协议列表
附录 L. 支持的协议/封装协议列表 目录 文件系统 Socket HTTP 和 HTTPS FTP 和 FTPS PHP 输入/输出流 压缩流 Secure Shell 2 音频流 以下是 PHP ...
- DataGrid列的合并
/// <summary> /// DataGrid列的合并 /// 注意:1.DataGrid在绑定的时候进行分组和排序,才能让相同的行放在一起 /// 2.方法应用的时机,应该在Dat ...