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

asynctask의 doinbackground 쪽 문제해결 도와주세요 ㅜ

0 추천
안녕하십니까!!! 요즘 앱 개발에 열중인 초보 개발자 입니다!!!!!

다름이 아니라 여러 소스를 분석 하는 도중에, 갤럭시 s3에서는 제 기능이 작동 하나,

갤럭시 s4에서는 제 기능을 동작 하지 못하고 아래와 같은 오류가 나서 이렇게 질문 드립니다 ㅜㅜ

이 상황을 어떻게 해결해야 될지 고수분들의 조언 부탁 드립니다 ㅜ

--------------------------------------------------------------------------------------------------------------소스 코드

 

 

 private class GIFEncodeTask extends AsyncTask<String, Integer, String> {

  @Override
  protected String doInBackground(String... arg0) {
   AnimatedGifEncoder e = new AnimatedGifEncoder();
   try {
    e.start(new FileOutputStream(new File(IMG_DIR, "output.gif")));
   } catch (FileNotFoundException e1) {
    throw new RuntimeException(e1);
   }
   e.setDelay(500); // 1 frame per sec
   File[] files = IMG_DIR.listFiles();
   int c = 0;
   for (File f : files) {
    c += 1;
    publishProgress((int) ((float) c / files.length * 100f));
    if (f.getName().contains(".jpg")) {
     Log.d("D", f.getName());

     BitmapFactory.Options bmOptions = new BitmapFactory.Options();
     bmOptions.inJustDecodeBounds = true;
     BitmapFactory.decodeFile(f.getAbsolutePath(), bmOptions);
     int photoW = bmOptions.outWidth;
     int photoH = bmOptions.outHeight;

     int targetW = 20;
     int targetH = targetW * photoH / photoW;

     int scaleFactor = photoW / targetW;

     // Decode the image file into a Bitmap sized to fill the
     // View
     bmOptions.inJustDecodeBounds = false;
     bmOptions.inSampleSize = scaleFactor;
     bmOptions.inPurgeable = true;

     Bitmap bitmap = BitmapFactory.decodeFile(
       f.getAbsolutePath(), bmOptions);

     e.addFrame(BitmapFactory.decodeFile(f.getAbsolutePath()));
    }
   }
   e.finish();
   publishProgress(-1);
   return null;
  }

 

 

----------------------------------------------------------------------------------------------------------------------오류 입니다.

07-29 10:28:18.029: E/AndroidRuntime(9918): FATAL EXCEPTION: AsyncTask #1
07-29 10:28:18.029: E/AndroidRuntime(9918): java.lang.RuntimeException: An error occured while executing doInBackground()
07-29 10:28:18.029: E/AndroidRuntime(9918):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at java.lang.Thread.run(Thread.java:856)
07-29 10:28:18.029: E/AndroidRuntime(9918): Caused by: java.lang.OutOfMemoryError
07-29 10:28:18.029: E/AndroidRuntime(9918):  at org.adroidtown.tan.AnimatedGifEncoder.getImageData(AnimatedGifEncoder.java:362)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at org.adroidtown.tan.AnimatedGifEncoder.getImagePixels(AnimatedGifEncoder.java:348)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at org.adroidtown.tan.AnimatedGifEncoder.addFrame(AnimatedGifEncoder.java:133)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at org.adroidtown.tan.NewActivity1$GIFEncodeTask.doInBackground(NewActivity1.java:162)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at org.adroidtown.tan.NewActivity1$GIFEncodeTask.doInBackground(NewActivity1.java:1)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-29 10:28:18.029: E/AndroidRuntime(9918):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-29 10:28:18.029: E/AndroidRuntime(9918):  ... 5 more

----------------------------------------------------------------------------------------------------------------------------------------------

 

여러분들의 답변 기다리고 있겠습니다 ㅜ
익명사용자 님이 2013년 7월 29일 질문

1개의 답변

0 추천
 
채택된 답변
Caused by: java.lang.OutOfMemoryError

 

메모리 문제입니다.

메모리 문제는 Exception이 발생하는 코드만 수정한다고 잡는게 아닙니다.

그 동안 메모리 누수가 있다가 이 부분에서 그게 터진 것 일 수도 있고요.

이런 문제는 본인이 잡을 수 밖에 없습니다.

Android OOM 등으로 검색하시면 많은 내용을 나옵니다.

 

매니페스트에 largeHeap 속성을 true 로 주고 사용해 보세요.

힙 메모리를 많이 사용하도록 하는 속성입니다.
원조안드로이드 (58,190 포인트) 님이 2013년 7월 29일 답변
감사합니다~!!! 메모리 문제 엿나 보군요!!!! manifest에 위의 내용 추가하니 동작합니다 ㅎㅎ 감사합니다!!!!
...