首页 文章

缓慢加载从SD卡到gridview的图像

提问于
浏览
0

我一直在尝试创建多个图像选择器,一切正常,但网格滚动非常慢和慢,我已经尝试使用不同的库在getView()中加载图像(Picasso,aquery ..)但它的没有差异,即使使用asynctask,这就是我的代码:Main:

public class Media extends ActionBarActivity {

私人AQuery aq;

GridView myGridView;
MyAdapter mySimpleCursorAdapter;    
boolean isOddClicked = true;
static String img=null;
final Uri srcUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
final String srcData  = MediaStore.Images.Media.DATA;
final String srcImgId = MediaStore.Images.Media._ID;    
final Uri thumbUri = MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI;
final String thumb_DATA = MediaStore.Images.Thumbnails.DATA;
final String thumb_IMAGE_ID = MediaStore.Images.Thumbnails.IMAGE_ID;

ArrayList al = new ArrayList(5);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.media);


  //Always show the menu
try {
    ViewConfiguration config = ViewConfiguration.get(this);
    Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
    if(menuKeyField != null) {
      menuKeyField.setAccessible(true);
      menuKeyField.setBoolean(config, false);
     } 
} catch (Exception ex) {}
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  getSupportActionBar().setHomeButtonEnabled(true); 
myGridView = (GridView)findViewById(R.id.gridview);        
// 
CursorLoader cursorLoader = new CursorLoader(
  this,srcUri,null,null,null,MediaStore.Images.Media.DATE_TAKEN+ " DESC");
//
Cursor cursor = cursorLoader.loadInBackground();
//
int[] to = {android.R.id.text1};
String[] from = {MediaStore.MediaColumns.TITLE};
mySimpleCursorAdapter = new MyAdapter(
  this,android.R.layout.simple_list_item_1, 
    cursor,from,to,CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
//
myGridView.setAdapter(mySimpleCursorAdapter);
myGridView.setOnItemClickListener(myOnItemClickListener);

}

OnItemClickListener myOnItemClickListener = new OnItemClickListener(){@ Overver public void onItemClick(AdapterView parent,View view,int position,long id){Cursor cursor = mySimpleCursorAdapter.getCursor(); cursor.moveToPosition(位置); int int_ID = cursor.getInt(cursor.getColumnIndex(MediaStore.Images.Media._ID)); }};

private Bitmap getThumbnail(int id){
    String[] thumbColumns = {srcData, srcImgId};
    CursorLoader thumbCursorLoader = new CursorLoader(
  this,srcUri,thumbColumns,srcImgId + "=" + id,null,null);        
Cursor thumbCursor = thumbCursorLoader.loadInBackground();
Bitmap thumbBitmap = null;
if(thumbCursor.moveToFirst()){
        int thCulumnIndex = thumbCursor.getColumnIndex(srcData);
        String thumbPath = thumbCursor.getString(thCulumnIndex);
        Toast.makeText(getApplicationContext(),thumbPath,Toast.LENGTH_LONG).show();         
        thumbBitmap = BitmapFactory.decodeFile(thumbPath);          
      //Create a Dialog to display the thumbnail
        AlertDialog.Builder thumbDialog = new AlertDialog.Builder(Media.this);
        ImageView thumbView = new ImageView(Media.this);
        thumbView.setImageBitmap(thumbBitmap);
        LinearLayout layout = new LinearLayout(Media.this);
  layout.setOrientation(LinearLayout.VERTICAL);
  layout.addView(thumbView);
  thumbDialog.setView(layout);
  thumbDialog.show();           
    }else{
        Toast.makeText(getApplicationContext(),"NO Thumbnail!",Toast.LENGTH_LONG).show();
    }
return thumbBitmap;
}
public class MyAdapter extends SimpleCursorAdapter{
Cursor myCursor;
  Context myContext;
    public MyAdapter(Context context, int layout, Cursor c, String[] from,int[] to, int flags) {
        super(context, layout, c, from, to, flags);         
        myCursor = c;
      myContext = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            LayoutInflater inflater=getLayoutInflater();
            convertView =inflater.inflate(R.layout.media_row, parent, false);   
         holder = new ViewHolder();
        holder.thumbnail = (ImageView)convertView.findViewById(R.id.thumb);
        holder.title = (CheckBox) convertView.findViewById(R.id.itemCheckBox);  
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
        myCursor.moveToPosition(position);
        final int myID = myCursor.getInt(myCursor.getColumnIndex(MediaStore.Images.Media._ID));
        final String[] thumbColumns = {srcData ,srcImgId};
        CursorLoader thumbCursorLoader = new CursorLoader(
          myContext,srcUri,thumbColumns,srcImgId + "=" + myID,null,null);
        Cursor thumbCursor = thumbCursorLoader.loadInBackground();          
    if(thumbCursor.moveToFirst()){
      final int thCulumnIndex = thumbCursor.getColumnIndex(thumb_DATA);
          final String thumbPath = thumbCursor.getString(thCulumnIndex);
            Bitmap o = MediaStore.Images.Thumbnails.getThumbnail(getApplicationContext().getContentResolver(), myID, Images.Thumbnails.MICRO_KIND, null);
            //holder.thumbnail.setImageBitmap(o);
        //Phase II:
            String uri = null;
            Cursor cursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(
      getContentResolver(), myID,
      MediaStore.Images.Thumbnails.MINI_KIND,null );
            if( cursor != null && cursor.getCount() > 0 ) {
              cursor.moveToFirst();//**EDIT**
              uri = cursor.getString( cursor.getColumnIndex( MediaStore.Images.Thumbnails.DATA ) );
            }

            MediaAsync loadAsync = new MediaAsync(getApplicationContext(), holder.thumbnail);
            loadAsync.onPostExecute(thumbPath);
            /*
            holder.thumbnail.setOnClickListener(new OnClickListener(){
      public void onClick(View v){
        img = thumbPath;
        al.add(thumbPath); 
        if (holder.title.isChecked()) {
          holder.title.setChecked(false);
          holder.thumbnail.setBackgroundResource(0);
        }else{
          holder.title.setChecked(true);
          holder.thumbnail.setBackgroundResource(R.drawable.media_row_border);
        }
      }
   });
   */
        }           
        return convertView ;
    }

}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.media, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == android.R.id.home) {
        finish();
  }
    else if (id == R.id.done) {
     Intent main = new Intent(this, Main.class);
 main.putStringArrayListExtra("media_lst", al);
 startActivity(main);
    }
    return super.onOptionsItemSelected(item);
}
private static class ViewHolder {
ImageView thumbnail;
CheckBox title;

mediaAsynce:

public class MediaAsync扩展了AsyncTask {private ImageView mImageView; private Context mContext;

public  MediaAsync(Context context,ImageView imageView) {
    mImageView = imageView;
    mContext   = context;
}

@Override
protected String doInBackground(String... params) {
    String url = params[0].toString();
    return url;
}

@Override
protected void onPostExecute(String result) {
    Uri uri = Uri.fromFile(new File(result));

    Picasso.with(mContext)
    .load(uri)
    //.resize(100, mWidth)
    .into(mImageView);
//  AQuery aq = new AQuery(mContext);
//  aq.id(mImageView).image(result,  true, true, 0, R.drawable.ic_launcher);

}}

1 回答

  • 0

    正如你所说,你已经尝试了毕加索库,它应该工作

    只需再次尝试使用picassso,就像这个异步任务一样,并不是必需的

    只需创建一个简单的适配器并加载图像 .

    public class GridViewDynamicAdapter extends BaseDynamicGridAdapter {
    ImageDetails details;
    public static List<ImageDetails> list;
    
    public GridViewDynamicAdapter(Context context, List<ImageDetails> items,
            int columnCount) {
        super(context, items, columnCount);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        CheeseViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(
                    R.layout.item_grid, null);
            holder = new CheeseViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (CheeseViewHolder) convertView.getTag();
        }
        if (position == getCount() - 1) {
            ImageApplication.fromRecorderPaths = (List<ImageDetails>) getItems();
        }
        details = (ImageDetails) getItem(position);
        // Log.d("Setting=", details.path);
        holder.build(getContext(), details.path);
        return convertView;
    }
    
    private class CheeseViewHolder {
        private ImageView image;
    
        private CheeseViewHolder(View view) {
            image = (ImageView) view.findViewById(R.id.item_img);
        }
    
        void build(final Context context, String title) {
            Picasso.with(context).load(new File(title)).centerCrop()
                    .resize(150, 150).error(R.drawable.ic_launcher).into(image);
        }
    }
    
    }
    

    OR

    Try this example

相关问题