2014-09-04 41 views
0

我正在开发一个应用程序,使用staggered gridview我有严重的性能问题,因为加载后只有6,7项滚动是非常laggy和我得到的一半时间:OutOfMemoryError在“机器人.graphics.BitmapFactory.nativeDecodeStream(本机方法)”用尽交错gridview布局

这是我的适配器(我用的支架模式):

package ngapps.socialbackground; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

import ngapps.socialbackground.Util.ImageDownloaderTask; 

/** 
* Created by Naor on 02/09/2014. 
*/ 
public class ItemAdapter extends BaseAdapter { 

    ArrayList<ImageItem> imageItemArrayList = new ArrayList<ImageItem>(); 
    Context context; 

    static class ViewHolder { 
     public TextView textView; 
     public ImageView imageView; 

     ViewHolder(View base) { 
      textView = (TextView) base.findViewById(R.id.textView); 
      imageView = (ImageView) base.findViewById(R.id.imageView); 
     } 
    } 

    public ItemAdapter(Context context){ 
     this.context = context; 
    } 

    @Override 
    public int getCount() { 
     return imageItemArrayList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return imageItemArrayList.get(position); 


    } 

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

    public void addItem(ImageItem imageItem){ 
     imageItemArrayList.add(imageItem); 
     notifyDataSetChanged(); 
    } 


    public void addItems(List<ImageItem> items) { 
     imageItemArrayList.addAll(items); 
     notifyDataSetChanged(); 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     ViewHolder holder; 
     if (convertView == null){ 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.item_layout,null); 
      holder = new ViewHolder(v); 
      v.setTag(holder); 
     } else { 
      holder = (ViewHolder) v.getTag(); 
     } 
     ImageItem curImageItem = imageItemArrayList.get(position); 
     holder.textView.setText(curImageItem.getText()); 
     if (curImageItem.getPreviewBitmap() != null) 
      holder.imageView.setImageBitmap(curImageItem.getPreviewBitmap()); 
     else 
      new ImageDownloaderTask(holder.imageView, curImageItem).execute(curImageItem.getImageURL()); 

     return v; 

    } 
} 

,这是ImageDownloaderTask:

package ngapps.socialbackground.Util; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.widget.ImageView; 

import java.io.InputStream; 

import ngapps.socialbackground.ImageItem; 

/** 
* Created by Naor on 04/09/2014. 
*/ 
public class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> { 
    ImageView bmImage; 
    ImageItem imageItem; 
    public ImageDownloaderTask(ImageView bmImage, ImageItem imageItem) { 
     this.bmImage = bmImage; 
     this.imageItem = imageItem; 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String url = urls[0]; 
     Bitmap mIcon = null; 
     try { 
      InputStream in = new java.net.URL(url).openStream(); 
      mIcon = BitmapFactory.decodeStream(in); 
     } catch (Exception e) { 
      Log.e("Error", e.getMessage()); 
     } 
     return mIcon; 
    } 

    protected void onPostExecute(Bitmap result) { 
     bmImage.setImageBitmap(result); 
     imageItem.setPreviewBitmap(result); 
    } 
} 

的图像是约160个像素宽, 我已验证持有人模式工作的,我只是创建视图的量有限,没有新的ImageDownloaderTask图像下载完毕

后创建,仍然之后落后一切都已完成加载时滚动

什么是伤害我的表现?

回答

0

您的代码存在内存泄漏,我发布了一个解决方案和提示来处理这个问题here。可能是OutOfMemoryException在您的代码行中发生:

InputStream in = new java.net.URL(url).openStream(); 
mIcon = BitmapFactory.decodeStream(in);