android中共享全局数据的方法(static导致的内存泄漏问题,但其实并未解决)
来源:互联网 发布:淘宝快递代理 编辑:程序博客网 时间:2024/05/21 18:42
在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系统中非常著名的异常:
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="mypackage.GameApplication" 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://blog.csdn.net/nokiaguy/article/details/5998986
0 0
- android中共享全局数据的方法(static导致的内存泄漏问题,但其实并未解决)
- android中共享全局数据的方法
- android中共享全局数据的方法
- android中共享全局数据的方法
- 常见的导致Android内存泄漏问题
- static关键字所导致的内存泄漏问题
- static关键字所导致的内存泄漏问题
- static关键字所导致的内存泄漏问题
- Android中static有关的内存泄漏
- Android中static有关的内存泄漏
- nodejs中函数共享作用域导致的内存泄漏
- Android webview内存泄漏问题的解决
- String类substring方法导致的Java内存泄漏问题
- String类substring方法导致的Java内存泄漏问题
- String类substring方法导致的Java内存泄漏问题
- 关于Android VideoView导致的内存泄漏的问题
- 关于Android VideoView导致的内存泄漏的问题
- cvLoadImage导致内存泄漏的解决
- 黑马程序员——【Java】IO——操作基本数据类型的流:DataInputStream & DataOutputStream
- 身边的逻辑学——简单的真理不简单(3) 当心电视与大众媒体
- 六西格玛知识-GR&R-测量系统的重复性和再现性
- 学习笔记 --- LINUX 驱动调试之定位系统僵死
- IOS TextField 用法大全
- android中共享全局数据的方法(static导致的内存泄漏问题,但其实并未解决)
- Azure中国区功能更新:自动缩放功能上线
- DataTemplateSelector 设置控件不同的样式
- iOS开发:自动旋转与调整大小
- 管家一直瞧不起陆洋母子,也不可能送来茶叶
- C/C++软件工程师就业求职手册学习笔记---第十一章
- Ubuntu系统的安装
- 测试网站访问速度的5个方法
- 黑马程序员——【Java】IO——操作字符数组的IO对象:ByteArrayInputStream & ByteArrayOutputStream