getResources()方法带来的NullPointerException

来源:互联网 发布:电脑桌面时间软件 编辑:程序博客网 时间:2024/06/15 13:55

一.非Activit类引用getResources()方法

      在进行Android开发的过程中,在一个非Activity类(TestClass)中引用了getResources()方法,如下:

       Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);

      结果错误信息提示:MyNewClass.class中没有getResources()方法。

     在Acitivity里面作如下改动:

      public static Resources resourcesInstance;
      resourcesInstance=this.getResources();

      TestClass这么引用:

     Bitmap bitmap = BitmapFactory.decodeResource(MainActivity.resourcesInstance, R.drawable.ic_launcher);
    这样来,代码没有错,但是运行出现了NullPointerException的程序运行崩溃的情况。

    虽然问题没有解决,但是看到这样两句话:

   在类的构造函数中传一个Context(如Activity或者Application,Service)进来”和“android.content.Context,getResources建立在Activity基础之上”。

    受此启发,解决办法如下:

   在TestClass.中创建getResources()方法:

    private Resources getResources() {
    // TODO Auto-generated method stub
    Resources mResources = null;
    mResources = getResources();
    return mResources;
    }

你会发现错误没有了,而且运行结果正常。


二.Activity类中引用getResources()方法

     比如在MainActivitry中定义了buildcade( String s)方法,该方法的功能是生成二维码,具体代码如下:

public Bitmap buildcade( String s) {
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
       // 缩放图片
       Matrix m = new Matrix();
       float sx = (float) 2*IMAGE_HALFWIDTH / mBitmap.getWidth();
       float sy = (float) 2*IMAGE_HALFWIDTH / mBitmap.getHeight();
       m.setScale(sx, sy);
       // 重新构造一个40*40的图片
       mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
               mBitmap.getHeight(), m, false);
       try {
           //这里的string最好提到外面,写成QRcode生成的输入参数,这样更普适;
       //.imageview.set
       endBitmap=cretaeBitmap(new String(s.getBytes(),
                   "ISO-8859-1"));
       } catch (WriterException e) {
           e.printStackTrace();
       } catch (UnsupportedEncodingException e) {
           e.printStackTrace();
       }
return endBitmap;
}

虽然在MainActivity中调用该方法可以正常运行,但在另一Activity中(TestActivity)中调用该方法,则会报空指针异常错误。解决办法是在buildcade( Context context,String s)方法传入conttext。代码如下:

  public Bitmap buildcade(Context context, String s) {
//getResource是Context的方法,要先传入Context对象,再用这个Context调用getResource,
//获得Resource对象。故buildcade()方法中传了一个context对象,否则会报空指针异常
mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
       // 缩放图片
       Matrix m = new Matrix();
       float sx = (float) 2*IMAGE_HALFWIDTH / mBitmap.getWidth();
       float sy = (float) 2*IMAGE_HALFWIDTH / mBitmap.getHeight();
       m.setScale(sx, sy);
       // 重新构造一个40*40的图片
       mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
               mBitmap.getHeight(), m, false);
       try {
           //这里的string最好提到外面,写成QRcode生成的输入参数,这样更普适;
       //.imageview.set
       endBitmap=cretaeBitmap(new String(s.getBytes(),
                   "ISO-8859-1"));
//           imageview.setImageBitmap(endBitmap);
       } catch (WriterException e) {
           e.printStackTrace();
       } catch (UnsupportedEncodingException e) {
           e.printStackTrace();
       }
return endBitmap;
}

MainActivitry中调用的方法:resultmap = buildcade(MainActivity.this,contents);

在TestActivity中调用的方法:MainActivity result = new MainActivity();       //创建一个对象
                                      resultmap = result.buildcade(TestActivity.this,MainActivity.contents);

0 0
原创粉丝点击