android 少用static全局变量共享数据讨论

本文介绍在Android应用中如何实现全局数据传递,特别是针对复杂类型数据的处理方式。通过使用ApplicationContext替代静态变量,避免内存泄漏风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

大模型国产替代是指在人工智能领域,国内自主研发和应用大规模预训练模型,以替代依赖于国外的大型模型。目前,国内已经有一些企业和研究机构在这方面取得了一定的进展。 首先,国内已经有一些大规模预训练模型的研发和应用。例如,百度推出的ERNIE(Enhanced Representation through Knowledge Integration)模型,腾讯推出的BERT(Bidirectional Encoder Representations from Transformers)模型等。这些模型在自然语言处理、文本生成等任务上取得了不错的效果。 其次,国内也在积极探索自主研发大规模预训练模型的路径。例如,中科院计算所推出的GPT(Generative Pre-trained Transformer)模型,通过自主研发和优化,取得了与国外同类模型相媲美的效果。此外,还有一些企业和研究机构在自主研发大规模预训练模型方面进行了一系列的尝试和实践。 然而,要实现真正的大模型国产替代,还面临一些挑战。首先是数据集的问题,大规模预训练模型需要大量的数据进行训练,而国内的数据集相对于国外来说还有一定的差距。其次是计算资源的问题,训练大规模模型需要庞大的计算资源,包括高性能的计算机和大规模的分布式训练平台。此外,还需要解决模型的可解释性、隐私保护等问题。 总体来说,大模型国产替代是可行的,但需要在数据集、计算资源、算法研发等方面进行持续投入和努力。通过国内企业、研究机构和政府的共同努力,相信在不久的将来,国内将能够自主研发和应用更多的大规模预训练模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值