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

splash화면 핸들러 이용 후 에러, 질문드립니다. [closed]

0 추천

splash 개발 하다 문제에 봉착중인

초보 안드로이드 개발자입니다.

 

디버그 시 

에러내용은 

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: kr.wbsi.wbs, PID: 11239
    java.lang.RuntimeException: Canvas: trying to draw too large(200704000bytes) bitmap.
        at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260)
        at android.graphics.Canvas.drawBitmap(Canvas.java:1415)
        at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:528)
        at android.graphics.drawable.LayerDrawable.draw(LayerDrawable.java:1012)
        at android.view.View.getDrawableRenderNode(View.java:17428)
        at android.view.View.drawBackground(View.java:17364)
        at android.view.View.draw(View.java:17176)
        at com.android.internal.policy.DecorView.draw(DecorView.java:753)
        at android.view.View.updateDisplayListIfDirty(View.java:16167)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:648)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:654)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:762)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2800)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2608)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2215)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
        at android.view.Choreographer.doCallbacks(Choreographer.java:686)
        at android.view.Choreographer.doFrame(Choreographer.java:621)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

이고 

해당 소스는 

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(SplashActivity.this, MainActivity.class);
                startActivity(intent);

                finish();
            }
        }, 5000);


//        Intent intent = new Intent(this, MainActivity.class);
//        startActivity(intent);
//
//        finish();
    }
}

입니다.

제가 문의하고 싶은 내용은 핸들러를 사용하지 않고 

그냥 화면 전환을 했을 경우에는 정상적으로 문제없이 실행이 되는데

splash 화면을 몇초 동안 머무르게 하고 싶어

핸들러를 사용하니 위의 에러가 나타납니다..;;

 

조언 부탁드립니다.

감사합니다.

질문을 종료한 이유: 답변으로 해결되었습니다
[안드로보이] (240 포인트) 님이 2019년 4월 3일 질문
[안드로보이]님이 2019년 4월 4일 closed

1개의 답변

+1 추천

 java.lang.RuntimeException: Canvas: trying to draw too large(200704000bytes) bitmap.

거의 191MB의 비트맵을 로드하셨네요.

비트맵의 해상도가 xxhdpi인데 drawable folder에 있는 경우 안드로이드 시스템은 그 비트맵을

mdpi해상도로 인식하고 3(가로) X 3(세로) = 9배로 늘립니다. 따라서 사이즈도 9배가 됩니다.

 

해결 방법은 두 가지 입니다.

1. 비트맵을 적절한 폴더(ex. drawable-xxhdpi 또는 drawable-xxxhdpi)에 넣는다.

 

2. 비트맵을 asset folder에 넣고 디코딩해 imageView에 로드한다. 

 (asset folder의 비트맵은 안드로이드 시스템에서 scale하지 않습니다.)

 

답변이 마음에 드시면 https://www.androidpub.com/index.php?mid=appnews&document_srl=2949168

글 한번 읽어주시면 감사하겠습니다.

 

 

franny (1,760 포인트) 님이 2019년 4월 3일 답변
franny님이 2019년 4월 3일 수정
감사합니다!!
핸들러문제가 아니었네요;;
말씀해주신대로 해상도에 따른 이미지를 따로 처리하지않아 발생한 문제였습니다.
해상도에 맞게 이미지를 해당 폴더에 넣어 해결했습니다~
감사합니다^^
...