我的应用程序在主线程中做了太多的工作,无法从android中的SD加载图像

我的应用程序在主线程中做了太多的工作,无法从android中的SD加载图像,android,image,load,Android,Image,Load,我的应用程序是从手机中的特定文件夹加载图像,然后将其显示为GridView 到目前为止,一切正常,但当我运行应用程序时,它需要太多的内存和工作,并且需要一些延迟才能向下滚动以查看GridView中的其他图像 我想让它平滑,不需要太多的内存,这样当我向下滚动时就不会出现延迟 这是我日志中的输出,正如您所看到的,它占用了太多的字节和工作量 09-16 12:57:17.458 14067-14067/com.b3du.test2 I/dalvikvm-heap﹕ Grow heap (frag c

我的应用程序是从手机中的特定文件夹加载图像,然后将其显示为GridView

到目前为止,一切正常,但当我运行应用程序时,它需要太多的内存和工作,并且需要一些延迟才能向下滚动以查看GridView中的其他图像

我想让它平滑,不需要太多的内存,这样当我向下滚动时就不会出现延迟 这是我日志中的输出,正如您所看到的,它占用了太多的字节和工作量

09-16 12:57:17.458  14067-14067/com.b3du.test2 I/dalvikvm-heap﹕ Grow heap (frag case) to 37.655MB for 16343056-byte allocation
09-16 12:57:17.708  14067-14067/com.b3du.test2 I/dalvikvm-heap﹕ Grow heap (frag case) to 37.661MB for 16343056-byte allocation
09-16 12:57:17.868  14067-14067/com.b3du.test2 I/dalvikvm-heap﹕ Grow heap (frag case) to 53.252MB for 16343056-byte allocation
09-16 12:57:17.979  14067-14067/com.b3du.test2 I/Choreographer﹕ Skipped 63 frames!  The application may be doing too much work on its main thread.
09-16 12:57:18.029  14067-14067/com.b3du.test2 I/dalvikvm-heap﹕ Grow heap (frag case) to 68.853MB for 16343056-byte allocation
09-16 12:57:18.249  14067-14067/com.b3du.test2 I/dalvikvm-heap﹕ Grow heap (frag case) to 84.440MB for 16343056-byte allocation
09-16 12:57:19.020  14067-14067/com.b3du.test2 I/dalvikvm-heap﹕ Grow heap (frag case) to 84.448MB for 16343056-byte allocation
09-16 12:57:19.240  14067-14067/com.b3du.test2 I/dalvikvm-heap﹕ Grow heap (frag case) to 84.447MB for 16343056-byte allocation
我的代码:

main.java

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imageAdapter = new ImageAdapter(this);
        imageAdapter.getFromSdcard();
        GridView imagegrid = (GridView) findViewById(R.id.PhoneImageGrid);
        imagegrid.setAdapter(imageAdapter);
adapter.java

public class ImageAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    ArrayList<String> f = new ArrayList<String>();// list of file paths
    File[] listFile;


    public ImageAdapter(Context context) {
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return f.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(
                    R.layout.galleryitem, null);
            holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage);

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }


        Bitmap myBitmap = BitmapFactory.decodeFile(f.get(position));
        holder.imageview.setImageBitmap(myBitmap);
        return convertView;
    }


    public void getFromSdcard()
    {
        File file= new File(android.os.Environment.getExternalStorageDirectory(),"/InstaDownloader-");

        if (file.isDirectory())
        {
            listFile = file.listFiles();


            for (int i = 0; i < listFile.length; i++)
            {
                f.add(listFile[i].getAbsolutePath());
            }
        }
    }
}
class ViewHolder {
    ImageView imageview;


}
公共类ImageAdapter扩展了BaseAdapter{
私人停车场;
ArrayList f=new ArrayList();//文件路径列表
文件[]列表文件;
公共ImageAdapter(上下文){
mInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
}
public int getCount(){
返回f.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
holder=新的ViewHolder();
convertView=mInflater.充气(
R.layout.galleryitem,空);
holder.imageview=(imageview)convertView.findViewById(R.id.thumbImage);
convertView.setTag(支架);
}
否则{
holder=(ViewHolder)convertView.getTag();
}
Bitmap myBitmap=BitmapFactory.decodeFile(f.get(position));
holder.imageview.setImageBitmap(myBitmap);
返回视图;
}
public void getFromSdcard()
{
File File=新文件(android.os.Environment.getExternalStorageDirectory(),“/InstaDownloader-”;
if(file.isDirectory())
{
listFile=file.listFiles();
for(int i=0;i
像这样做。。在imageAdapter内创建一个类并扩展异步任务

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

        @Override
        protected String doInBackground(Bitmap... thumb) {
            // Do something with bitmap

            return //Bitmap; //Returns this to onPostExicute
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            // Set Bitmap to ImageView
        }

    }

我建议不要将位图传递给异步任务。insted将引用传递给要设置为字符串的图像。然后在后台类中处理图像,并在执行后将图像设置为查看。Async task生成一个线程,这样主UI线程就不会有很多工作要做。如果UI线程工作过多,框架会掉落,应用程序甚至可能在某些设备上崩溃。。希望有帮助。

您需要在AsycTask中运行任务,但我认为AsycTask不是来自internet的数据吗。。即使我不知道在AsycTask中放什么,我也只有一个适配器来加载图像和我的主。。我应该把所有的适配器都放在AsycTask中吗?hmmis在适配器中设置数据之前有没有复杂的代码?@mtetno我已经发布了完整的代码。。这两个类是我迄今为止加载图像的类。。但正如我所说,当我运行应用程序时,上传它需要很多时间和延迟。
new SetImage().execute(//bitmap);