마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Assets 이용시 일반 클래스에서 Bitmap을 관리 할순 없나요?

0 추천

게임을 만들어 보고 있는 초보자 입니다.

다름이 아니라

책을 보고 따라 하면서 하나하나 만들고 있는데 

png이미지를 assets에 저장하고 불러올때에 

view클래스에서 

public Bitmap loadBitmap(String filename) 
throws Exception{
Bitmap bm = null;
AssetManager am = mMainContext.getAssets();
try{
BufferedInputStream buf = 
new BufferedInputStream(am.open(filename));
bm = BitmapFactory.decodeStream(buf);
}catch(Exception e){
bm = BitmapFactory.decodeStream(am.open("cooldown.png"));
}

return bm;
}

 

 
라는 메소드를 통해 이미지를 불러와서 사용중인데
[저 메소드는 메인뷰에서 그대로 사용중이던것]
[이후 InItBitmap 에서  Context mMainContext; 을 쓰고 init클래스에 loadbitmap 메소드 넣음]
 
이것을 다른 기본 클래스로 옮긴후 사용시 앱을 실행시키면 널포인트 오류가 뜨는데..
어떤점이 문제 인지 혹 알수 있을가요
 
 
InItBitmap 이라는 클래스를 만들고 
이 클래스 생성자에 
Bitmap mJumpBitmap;
mJumpBitmap = loadBitmap("upbt.png");

 

이렇게 해서 메인뷰에서 mJumpBitmap을
mController = new UIButton( 1, 225, 225, mScreenConfig, mInit.mJumpBitmap);

이런 식으로 bitmap넣는 부분에 넣어 사용하고 싶은데

오류가 발생하네요......

그래서 혹시나 

InItBitmap클래스 에서

mJumpBitmap = mMainview.loadBitmap("upbt.png");

 

assets를 상속없는, 액티비티가 아닌 일반 클래스에서는 사용할수 없나요?

Augustino (200 포인트) 님이 2014년 11월 20일 질문

2개의 답변

+1 추천
 
채택된 답변

android 약간의 특성이 있어서 context 를 항상 전달하면서 해야 합니다. 

loadBitmap(Context context, String filename) 식으로 되야 겠죠 메모리에 보관해서 하면 또 이게 가비지 컬럭터에서 날리므로 항상~~~~ 새로 전달하세요

aucd29 (218,390 포인트) 님이 2014년 11월 20일 답변
Augustino님이 2014년 11월 20일 채택됨
음 그럼 init클래스의 loadbitmap 메소드를
public Bitmap loadBitmap(Context context, String filename)   
            throws Exception{
           
            Bitmap bm;
            AssetManager am = context.getAssets();
            try{
            BufferedInputStream buf =
                new BufferedInputStream(am.open(filename));
                bm = BitmapFactory.decodeStream(buf);
            }catch(Exception e){
                bm = BitmapFactory.decodeStream(am.open("cooldown.png"));
            }
           
            return bm;
        }
이렇게 변경하고
init클래스 생성자에
mJumpBitmap                = loadBitmap(mContext, "upbt.png");
이렇게 사용할때 mContext는 어떤걸 말하나요?.....
하나 궁금한것이
context를 클래스에서 Context mContext;로 하면 생성이 되는지요?
아니면 메인뷰, 혹은 액티비티에서 따로 가져 와야 하는건가요?

그리고 가져와야 한다면 어찌 가져 오는건지 알수 있을가요?

Context context = getApplicationContext();  
이걸 이용해서 가져 올수도 있다는데......
어찌 사용하는건질 알수가 없어서......
0 추천
mMainContext가 null 이겠군요.
익명사용자 님이 2014년 11월 20일 답변
그...그래서
public Bitmap loadBitmap(String filename)   
            throws Exception{
            Bitmap bm = null;
//이부분
            AssetManager am = mMainView.mMainContext.getAssets();
            try{
            BufferedInputStream buf =
                new BufferedInputStream(am.open(filename));
                bm = BitmapFactory.decodeStream(buf);
            }catch(Exception e){
                bm = BitmapFactory.decodeStream(am.open("cooldown.png"));
            }
           
            return bm;
        }
이게 InItBitmap클래스 에서 쓰는 메소드, (= 메인뷰에서 쓰던 로드 비트맵하고 같아요)

여기에서 //이부분이라 표시한곳을
mMainView.mMainContext를 써서
메인뷰 context를 사용했는데도 오류가 발생하는데....왜그런건지 알수 있을가요?ㅜㅜ
...