我的应用程序在主线程中做了太多的工作,无法从android中的SD加载图像
我的应用程序是从手机中的特定文件夹加载图像,然后将其显示为GridView 到目前为止,一切正常,但当我运行应用程序时,它需要太多的内存和工作,并且需要一些延迟才能向下滚动以查看GridView中的其他图像 我想让它平滑,不需要太多的内存,这样当我向下滚动时就不会出现延迟 这是我日志中的输出,正如您所看到的,它占用了太多的字节和工作量我的应用程序在主线程中做了太多的工作,无法从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
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);