2012-10-12 6 views
0

내 앱이 한 곳에서 너무 느리게 실행 중입니다. 앱의 나머지 4 가지 활동은 합리적으로 빠르지 만 활동 중 하나는 너무 느려서 편안함을 느끼지 못합니다. 주 활동에서 버튼을 누르면 각보기에서 이미지와 텍스트로 채워지는 gridView로 다음 활동을 시작합니다. 버튼을 누르고 나면 gridView로드 페이지가 나타나기까지 3 ~ 5 초 정도 걸리므로 너무 오래 걸립니다.커서 동작 및 이미지로드가 많은 느린 앱 속도 향상

ZTE에서 만든 다양한 저속 600mhz 단일 코어 프로세서 안드로이드 전화에서의 테스트. 남아프리카 사막의 칼라 하리 부시 맨 (Callahari Bushmen)과 같은 사람들이 사용하는 저비용 전화 중 하나. 알고 있지 않은 사람들은 삼성 갤럭시 S3 나 아이폰 5와 같은 등급이 아니라고 말하는 것은 삼가면서 말하는 것입니다.

나는 천천히 달리기에서 코드를 할 수 있는지 궁금합니다. 애플 리케이션의 일부는 속도에 대한 엉덩이에 차기를 제공합니다. 어떤 아이디어? 필자가 볼 수있는 유일한 점은 여러 커서와 데이터베이스 쿼리를 광범위하게 사용하면 속도가 느려질 수 있다는 것입니다. GridView를 로딩하는 것이 심각한 jigaboo를 차지한다고 생각합니다.

내 코드가 엉망이지만, 내가 할 수있는 것이 있는지 궁금합니다. 별도의 스레드에서 모든 콘텐츠 공급자 쿼리 내용을 처리하는 방법은 어떻습니까? 어떤 아이디어? 이 코드는 enima가 필요합니다.

아래 코드는 앱 속도를 저하시키는 부분입니다.

private void init_phone_image_grid() { 
     String[] img = { MediaStore.Images.Media._ID }; 
     imagecursor = managedQuery(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI, img, MediaStore.Images.Media.IS_PRIVATE + "='" + 1 +"'",null, MediaStore.Images.Media._ID); 
     image_column_index = imagecursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); 
     count = imagecursor.getCount(); 
     imagegrid = (GridView) findViewById(R.id.PhoneImageGrid); 
     imagegrid.setAdapter(new ImageAdapter(getApplicationContext())); 
     imagegrid.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView parent, View v,int position, long id) { 

        System.gc(); 

        String[] img = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE }; 
        imagecursor = managedQuery(
          MediaStore.Images.Media.EXTERNAL_CONTENT_URI, img, MediaStore.Images.Media.IS_PRIVATE + "='" + 1 +"'",null, MediaStore.Images.Media._ID); 
        image_column_index = imagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
        count = imagecursor.getCount(); 
        imagecursor.moveToPosition(position); 



        // String[] proj = { }; 
        // imagecursor = managedQuery(
        //  MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj,null, null, null); 
        // image_column_index = imagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 


        String i = imagecursor.getString(image_column_index); 
        // terra = i; 



      // opens larger pic Intent intent = new Intent(getApplicationContext(), ViewImage.class); 
       /* intent.putExtra("filename", i); 
        startActivity(intent); */ 

        // passing bitmap image to another activiy and starting that activity 
       // textone.setText(i); (i == /mnt/sdcard/DCIM/pic06.png) 
        Intent intentBitmapStart = new Intent(ImageThumbnailsActivity.this, Editor.class); 
        intentBitmapStart.putExtra("filename", i); 

        startActivity(intentBitmapStart); 

        // Intent myIntent = new Intent(ImageThumbnailsActivity.this, Editor.class); 
        // ImageThumbnailsActivity.this.startActivity(myIntent); 
       } 
     }); 
    } 

여기는 어댑터 메소드의 getview 섹션입니다.

public View getView(int position,View convertView,ViewGroup parent) { 
       System.gc(); 


       if (convertView == null) { 
        // Make up a new view 
        LayoutInflater inflater = (LayoutInflater) mContext 
          .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        view = inflater.inflate(R.layout.image_item, null); 
       } else { 
        // Use convertView if it is available 
        view = convertView; 
       } 
       PanoramioItem s = mImageManager.get(position); 

       ImageView i = (ImageView) view.findViewById(R.id.image); 
       i.setImageBitmap(s.getBitmap()); 
       i.setBackgroundResource(R.drawable.picture_frame); 

       TextView t = (TextView) view.findViewById(R.id.title); 
       t.setText(s.getTitle()); 

       t = (TextView) view.findViewById(R.id.owner); 
       t.setText(s.getOwner()); 
       return view; 
      } 


       View view; 
       ImageView iv = new ImageView(mContext.getApplicationContext()); 
       if (convertView == null) { 

        LayoutInflater inflater = (LayoutInflater) mContext 
          .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        view = inflater.inflate(R.layout.activity_adapterview, null); 
       } else { 
        // Use convertView if it is available 
       view = convertView; 
       } 

        // Toast.makeText(ImageThumbnailsActivity.this, "image_column_index2: " + image_column_index, Toast.LENGTH_SHORT).show(); 

        imagecursor.moveToPosition(position); 
        int id = imagecursor.getInt(image_column_index); 

        Uri uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ""+ id); 

        String imagePath = getRealPathFromURI(uri); 

        String[] titleText = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE }; 

        textcursor = managedQuery(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, titleText, MediaStore.Images.Media.DATA + "='" + imagePath +"'",null, null); 
        if(textcursor.moveToFirst()){ 

         titleString = (String) textcursor.getString(textcursor.getColumnIndex(MediaStore.Images.Media.TITLE)); 
        textcursor.close(); 
        } 
        else{ 
         titleString = ""; 
        } 

        BitmapFactory.Options bfo = new BitmapFactory.Options(); 
        bfo.inJustDecodeBounds = true; 

        Bitmap bm = BitmapFactory.decodeFile(imagePath, bfo); 

       int imageHeight = bfo.outHeight; 
       int imageWidth = bfo.outWidth; 
       String imageType = bfo.outMimeType; 

       BitmapFactory.Options bfo2 = new BitmapFactory.Options(); 

       int reqHeight = 50; 
       int reqWidth = 50; 

       if (imageHeight > reqHeight || imageWidth > reqWidth) { 
        if (imageWidth > imageHeight) { 
         bfo2.inSampleSize = Math.round((float)imageHeight/(float)reqHeight); 
        } else { 
         bfo2.inSampleSize = Math.round((float)imageWidth/(float)reqWidth); 
        } 
       } 

       Bitmap bm2 = BitmapFactory.decodeFile(imagePath, bfo2); 

        // iv.setImageBitmap(bm2); 

       ImageView i = (ImageView) view.findViewById(R.id.adapterimageview); 

       i.setImageBitmap(bm2); 



       TextView t = (TextView) view.findViewById(R.id.adaptertextview); 
       t.setText(titleString); 


       // iv.setImageURI(Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ""+ id)); 
        view.setLayoutParams(new GridView.LayoutParams(103, 103)); 


        return view; 

     } 

답변

0

일반적으로 안드로이드에서 장기 실행 작업은 별도의 스레드에서 수행됩니다. UI 스레드를 5 초 이상 길게 잡으면 사용자가 "응용 프로그램이 응답하지 않습니다"대화 상자가 표시되어 화가납니다. Android에서 비동기 작업을 실행하는 좋은 방법은 AsyncTask을 사용하는 것입니다. 비동기 데이터로드를 구성하는 또 다른 좋은 방법은 Loaders이라는 새로운 개념을 사용하는 것입니다. 이러한 접근 방법을 습득하면 로우 엔드 장치에서 응용 프로그램이 빠르고 반응 할 수 있습니다. 희망이 도움이됩니다.

+0

감사합니다. 지금부터 로더를 사용하여 확인해 보겠습니다. 전에는 그렇게 생각하지 않았습니다. – Kevik

+0

@Kevik, 천만에. 오, 여기 또 다른 인기있는 게시물이 있습니다. 조금 오래되었지만 그럼에도 불구하고 매우 도움이됩니다. http://android-developers.blogspot.com/2009/05/painless-threading.html – Egor