• Android全局变量是用public&nbsp…


     在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属性来指定这个类,代码如 下:

    <</SPAN> application android:name =".MyApp" android:icon ="@drawable/icon" android:label ="@string/app_name" >

    </</SPAN> 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());
  • 相关阅读:
    前端模块的前生今世
    variable fonts
    node
    webpack tree shaking
    es6 proxy浅析
    如何实现优美的骨架屏
    阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?
    新来个技术总监,禁止我们使用Lombok!
    2020年Java程序员应该学习的10大技术
    为啥HashMap的默认容量是16?
  • 原文地址:https://www.cnblogs.com/crane13/p/3150135.html
Copyright © 2020-2023  润新知