0

我的应用程序在一个地方运行有点太慢了。该应用程序的其余 4 种不同活动的响应速度相当快,但其中一项活动太慢而无法舒适。在主活动中,您按下一个按钮,它会使用 gridView 启动下一个活动,该网格视图在每个视图中填充图像和文本。按下按钮后,它需要很长时间,例如 3 到 5 秒,然后才出现加载的 gridView 页面。

在中兴通讯生产的不同速度的 600mhz 单核处理器安卓手机上进行测试。南非沙漠中的喀拉哈里布须曼人等人使用的低成本电话之一。对于那些不知道的人,可以轻描淡写地说它与三星 Galaxy S3 或 iPhone 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;

        }
4

1 回答 1

0

通常,Android 中任何长时间运行的操作都是在单独的线程中完成的。如果您将 UI 线程保持 5 秒以上,您的用户将看到“应用程序没有响应”对话框并且可能会生气。在 Android 中执行异步操作的一个好方法是使用AsyncTask。组织异步数据加载的另一种好方法是使用称为Loaders的新概念。如果您掌握了这些方法,您就可以确保您的应用程序在任何低端设备上都能快速响应。希望这可以帮助。

于 2012-10-12T06:30:57.767 回答