0

我有一个活动必须抓取重图像,调整它们的大小并加载到GridView. 由于所有这些获取、调整大小的过程都非常耗时,因此当我尝试从另一个屏幕加载此屏幕时ACtivity,会出现延迟。

我怎样才能首先加载这个“网格活动”的内容,然后只有在所有图像都加载后才打开它?

使用startActivityForResult? GridView如果这是一个解决方案,我如何检测自滚动加载图像以来所有图像都已加载。

编辑

有人建议我使用AsyncTask我之前使用过几十次的那个。但有些事情让我感到困惑。

  1. 我应该将自定义适配器初始化发送到 AsyncTask 吗?

    mGridView = (GridView) findViewById(R.id.gridview);
    mImageAdapter = new ImageAdapter(this);
    mGridView.setAdapter(mImageAdapter);
    
  2. 或者我应该在自定义适配器内部执行异步任务,即在方法内部,getView并且每个 gridview 单元格创建一个对 my 的新调用AsyncTask

4

2 回答 2

1

尝试创建一个AsyncTask.

创建你的Activity正常。最后onCreate(),开始你的AsyncTask.

在您AsyncTaskonPreExecute()方法上,向用户显示一些动画或消息。

doInBackground()处理您的图像。

在 上onPostExecute(),加载您的图像GridView并停止动画或关闭消息。

这样,您Activity将不会有您在创建时提到的延迟。

于 2013-08-28T18:30:35.680 回答
1

您可以AsyncTask通过将所有获取和调整大小的代码放入方法中来使用,您可以将数据保存在要返回给方法doInBacground的对象(可能是ArrayListof )中(请参阅AsyncTask 通用类型)。BitmaponPostExecute

然后还必须ImageAdapter通过将您从中获得的对象添加为参数来更改您的构造AsyncTask函数。

public class DownloadPdfTask extends AsyncTask<Void, Integer, ArrayList<Bitmap>> {
    private ArrayList<Bitmap> images;
    @Override
    protected ArrayList<Bitmap> doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        /** your long task here, and set "images" **/
        return images;
    }

    @Override
    protected void onPostExecute(ArrayList<Bitmap> images) {
        // TODO Auto-generated method stub
        super.onPostExecute(images);
        mGridView = (GridView) findViewById(R.id.gridview);
        mImageAdapter = new ImageAdapter(this, images); // new construcor
        mGridView.setAdapter(mImageAdapter);
    }

}

在您的适配器中使用images您想要的列表!

于 2013-08-28T21:58:31.110 回答