转自:http://blog.csdn.net/nokiaguy/article/details/5998986

在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中使用。全局的,哈哈。

android 少用static全局变量共享数据讨论相关推荐

  1. linux动态链接库全局变量共享问题DLL共享数据段

    Linux写时拷贝技术(copy-on-write) 进程间是相互独立的,其实完全可以看成A.B两个进程各自有一份单独的liba.so和libb.so,相应的动态库的代码段和数据段都是各个进程各自有一 ...

  2. 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

    文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...

  3. provider android简书,Android 使用ContentProvider在应用间共享数据

    Android 使用ContentProvider在应用间共享数据 题图 www.gratisography.com 在开发的过程中,有时会有需求要实现应用程序之间实现数据共享,在Android系统中 ...

  4. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(2)

        Step 7. ContentProviderProxy.query       这个函数定义在frameworks/base/core/java/android/content/Conten ...

  5. python跨文件全局变量_Python 进程之间共享数据(全局变量)的方法

    进程之间共享数据(数值型): import multiprocessing def func(num): num.value=10.78 #子进程改变数值的值,主进程跟着改变 if __name__= ...

  6. Python 进程之间共享数据(全局变量)

    Python 进程之间共享数据(全局变量) 进程之间共享数据(数值型): import multiprocessing def func(num): num.value=10.78 #子进程改变数值的 ...

  7. android 应用间共享数据,调用其他app数据资源

    在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见:而我们可以使他们对其他的应用程序可见,可以通过Sha ...

  8. android 共享数据,android进程间共享简单数据

    我们知道,在android中,保存简单的数据最方便的就是使用SharedPreferences,然而,SharedPreferences虽然说也可以设置成进程间共享数据,但是并不可靠(更致命的是,不同 ...

  9. python进程共享全局变量 时延_Python 进程之间共享数据(全局变量)的方法

    进程之间共享数据(数值型): import multiprocessing def func(num): num.value=10.78 #子进程改变数值的值,主进程跟着改变 if __name__= ...

最新文章

  1. 记一个网络传输功能的实现过程
  2. 一流程序员靠数学,二流程序员靠算法,低端看高端就是黑魔法
  3. 【英语学习】【WOTD】mettlesome 释义/词源/示例
  4. extended-insert对mysqldump及导入性能的影响
  5. 网管怎么么叫好听_找了三天三夜,这24首歌,太好听了,一定要送给你!谢谢最亲爱的你,梦中想着你,死心塌地去爱你...
  6. SpringBoot整合Shiro框架
  7. Android手游lua脚本的加密与解密
  8. Java 获取Excel中的表单控件
  9. 《淘宝技术这十年》读书笔记
  10. linux设置字符编码gbk,CentOS修改默认字符编码为GBK
  11. QQ音乐车机模式中蓝牙音乐无效
  12. selenium缩放浏览器
  13. 阿里云GPU云服务器gn5i/gn5/gn6i/gn6v详解
  14. 弘辽科技:淘宝卖家打造爆款商品的六大技巧!
  15. Redis - 附近商铺
  16. java咖啡_JAVA—咖啡馆
  17. MySQL中修改ID为自增
  18. 她姓敖 是计算机系的,姓敖的名人
  19. docker配置python环境_PyCharm使用Docker镜像搭建Python开发环境
  20. 杜克大学计算机数据科学,杜克大学数据科学硕士专业

热门文章

  1. 2021年远程办公未来发展趋势如何?
  2. 迭代和递归的应用例子c语言,递归和迭代的应用以及区别
  3. 区块链:人类抵御人工智能盛行的最佳方案
  4. layui input框列表显示默认历史搜索记录(不要有历史搜索记录)
  5. win10 上安装虚拟机
  6. Android 跳转设置电池不优化
  7. 微信小程序map组件展示当前位置修改标记点图标
  8. 搜索附近蓝牙设备并进行匹配
  9. Spring JdbcTemplate RowMapper Junit Test Example
  10. 卷积神经网络的改进 —— 分组卷积、DW 与 PW