0

ある場所でアプリの実行が少し遅すぎます。アプリの 4 つの異なるアクティビティの残りはかなり高速に応答しますが、アクティビティの 1 つは遅すぎて快適ではありません。メイン アクティビティからボタンを押すと、各ビューに画像とテキストが表示される gridView で次のアクティビティが開始されます。ボタンを押した後、gridView がロードされたページが表示されるまでに 3 ~ 5 秒かかるなど、時間がかかりすぎます。

ZTE製のさまざまな低速600mhzシングルコアプロセッサAndroid携帯でのテスト。南アフリカ砂漠のカラハリ ブッシュマンなどの人々が使用する低価格の電話の 1 つ。知らない人にとっては、Samsung Galaxy S3 や iPhone 5 と同じクラスではないと言っても過言ではありません。

アプリの実行速度が遅い部分のコードに何か手を加えて、速度を向上させることができないかと考えています。何か案は?私が見ることができる唯一のことは、複数のカーソルとデータベースのクエリの広範な使用が速度を低下させている可能性があることです. gridView をロードすると、深刻なジガブーが必要になると思います。

私のコードはごちゃごちゃしていますが、何かできることはないでしょうか。すべてのコンテンツ プロバイダーのクエリを別のスレッドで実行するのはどうですか? 何か案は?このコードにはエニマが必要です。

以下は、アプリの速度を低下させているコード部分のサンプルです。

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;

        }
4

1 に答える 1

0

通常、Android で長時間実行される操作は別のスレッドで行われます。UI スレッドを 5 秒以上保持すると、ユーザーに「アプリケーションが応答していません」というダイアログが表示され、おそらく怒るでしょう。Android で非同期操作を実行する良い方法は、AsyncTaskを使用することです。非同期データ読み込みを整理するもう 1 つの優れた方法は、Loadersと呼ばれる新しい概念を使用することです。これらのアプローチを習得すれば、ローエンドのデバイスでもアプリケーションが高速で応答性が高いことを確信できます。お役に立てれば。

于 2012-10-12T06:30:57.767 に答える