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

안드로이드 AsyncTask 질문 있습니다.

0 추천
public void testImageFile()
    {
        

            InputStream ims = new FileInputStream(mCurrentPhotoPath);

            CompressClass task = new CompressClass();
            task.execute(BitmapFactory.decodeStream(ims));

        }catch(Exception e ){
            e.printStackTrace();
        }
    }

    private class CompressClass extends AsyncTask<Bitmap,Void,Bitmap> {

        @Override
        protected Bitmap doInBackground(Bitmap... params) {

            Bitmap bitmap = Bitmap.createScaledBitmap(params[0],100,100,false);

            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);

            if(bitmap != null)
            {
            
                imageView.setImageBitmap(bitmap);

            }else {
                Toast.makeText(getApplicationContext(),"실패 ",Toast.LENGTH_SHORT).show();
            }
        }
    }

 

이렇게 했는데요 여전히

 

 I/Choreographer: Skipped 40 frames!  The application may be doing too much work on its main thread. 에러를 뱉는 이유가 뭘까요 ?? ;;; 답변 부탁드립니다!!
알파고 (4,320 포인트) 님이 2017년 9월 18일 질문

1개의 답변

+1 추천
 
채택된 답변
BitmapFactory.decodeStream를 메인스레드에서 실행해서 그렇습니다.
익명사용자 님이 2017년 9월 19일 답변
알파고님이 2017년 9월 20일 채택됨
그렇다면 excute에는 어떤 내용을 넣어서 실행해줘야좋을까요??
mCurrentPhotoPath만 넘기고, 하위동작은 doInBackground 안에서 하면 됩니다.
Bitmap 변수는 Task안에서 Private으로 선언해서 사용하고,
나중에 bitmap = null을 해 주세요. (안해도 되지만, 하면 더 빨리 메모리 free가 됩니다)
네트워크로 가져오는 것이 아니라 메모리에서 가져오는 사진인데 굳이 쓰레드를 해주어야할 필요가 있나요?
요새 사진은 10메가가 넘고, 가로 세로가 4500*2500 뭐 이정도의 해상도로 찍히죠. 그걸 지금 100*100으로 계산하려면, 저 변환 툴이 천만개의 픽셀을 다 일일이 계산해서 줄여주는 로직을 수행하는 것입니다. 그걸 빨리 하는 것이지만, 순간적으로 CPU를 많이 잡아 먹습니다. 원본 해상도가 낮다고 해도, 최소 백만개 이상의 픽셀 연산을 해야 할 것입니다.
에러는 뜨지않는데 이미지뷰에 사진이 정상적으로 올라갈 때가 있고 안될때가있는데 왜그런지모르겠어요 쓰레드 문제라 생각했는데
쓰레드를 돌리지않고 앨범에서 가져오는 사진은 잘되거든요
 대체 왜그럴까요 ㅠㅠ 아예 안되면 몰라도 됬다 안됬다하니깐 돌아버리겠어요..
증상을 좀 더 자세히 새로운 질문으로 올려 주세요. 남이 답변한 것에 대한 쓰레드에 걸리니까 앞서 답변했던 분에게 죄송하네요.
...