我有一项活动,必须抓取重图像,调整大小并加载到GridView
。由于所有这些获取,调整大小的过程都非常耗时,当我尝试从另一个ACtivity
加载此屏幕时,我会遇到延迟。
如何首先加载此“网格活动”的内容并仅在加载所有图像后将其打开?
使用startActivityForResult
?如果这是一个解决方案,我怎么能检测到所有图像都已加载,因为GridView
在滚动时加载图像。
修改
我被建议使用AsyncTask
,之前我曾使用过几十次。但有些事让我困惑。
我应该将自定义适配器初始化发送到AsyncTask吗?
mGridView = (GridView) findViewById(R.id.gridview);
mImageAdapter = new ImageAdapter(this);
mGridView.setAdapter(mImageAdapter);
或者我应该在自定义适配器内部执行异步任务,即在方法getView
内,并且每个gridview单元格都会创建一个对AsyncTask
的新调用?
答案 0 :(得分:1)
尝试创建AsyncTask
。
正常创建Activity
。在onCreate()
结尾处,开始AsyncTask
。
在AsyncTask
的{{1}}方法上,向用户显示一些动画或消息。
在onPreExecute()
处理您的图片。
在doInBackground()
上,将您的图片加载到onPostExecute()
上,然后停止动画或关闭该消息。
这样,您的GridView
就不会在创建时提到您的延迟。
答案 1 :(得分:1)
您可以通过在AsyncTask
方法中放置获取和调整大小的所有代码来使用doInBacground
,您可以将数据保存在对象中(可能是ArrayList
Bitmap
}})返回onPostExecute
方法(参见AsyncTask genric types)。
然后还必须通过将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
列表!