Android-传递数据的一些讨论

在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。下面还需要一个重要的步骤,就是在标签中使用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://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873251.html  

 

 

 

 

 

 

 

从零构建:ESP32S3无线DAP-Link调试器的硬件与软件协同设计 本文详细介绍了基于ESP32S3的无线DAP-Link调试器的硬件与软件协同设计,涵盖关键元器件选型、无线通信协议优化、双核任务处理及低功耗调试方案。通过ESP-NOW协议实现低延迟无线调试,结合USB协议栈与双核协同,为嵌入式开发提供高效灵活的调试解决方案。 阅读详情

相关推荐

HighTec安装(官网免费)编译 嘎嘎详细~

安装软件最好有自己的一套安装规则,工程软件除了安装主体外还会有很多其他的东西,比如license或者还会有一些驱动,如果所有都随意安装会导致你需要卸载,或者更新软件时,有的需要将原来软件卸载干净,如果没有清晰的安装路径那真是灾难啊~请确保此目录中只有个人许可证。这样基本的配置就ok了,下面打开hightec软件检验下license是否识别到了,会让你选个工作区,建议自己建一个,要不你以后就找不到了,,,如下图拉到下面,按照要求填写信息,随便写就行,注意主要的MAC地址要填本机的物理地址,然后点击2即可。

weixin_60793044的博客 1万+

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

虽然Intent和静态变量都可以传递数据,但intent功能有限,static过于wrong,那么有没有一种更好的方式呢,答案是yes,这就是Application Context,一个全局的Context,详情请读者参见本文的内容。

一个被知识诅咒的人 1万+

Anaconda镜像源切换全攻略:从清华源到恢复默认设置的完整流程

本文详细介绍了Anaconda镜像源的管理与优化,重点讲解了如何配置清华源以提升国内下载速度。内容涵盖镜像源工作原理、清华源详细配置步骤、多源管理策略、常见问题排查以及如何安全恢复默认设置,帮助用户构建完整的镜像源管理体系。

weixin_28828243的博客 1021
上一篇: xml文件内引用资源
下一篇: Android编译出现Multiple substitutions specified in non-positional format
thinkfeed
博客等级 码龄18年 8粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值