Android 在类别(项目导航视图)之间移动时性能降低

Android 在类别(项目导航视图)之间移动时性能降低,android,xml,gridview,Android,Xml,Gridview,我正在尝试创建具有不同类别的应用程序,每个类别都有一组图片,我从第一个类别开始(10张图片)运行良好,但当我移动到另一个类别时,我的应用程序运行缓慢。我正在使用GridView @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ArrayList<String> movieList = new Arr

我正在尝试创建具有不同类别的应用程序,每个类别都有一组图片,我从第一个类别开始(10张图片)运行良好,但当我移动到另一个类别时,我的应用程序运行缓慢。我正在使用
GridView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,    Bundle savedInstanceState) {
    ArrayList<String> movieList =  new ArrayList<>();
    movieList.add("https://scontent-waw1-1.xx.fbcdn.net/v/t1.0-   9/18199348_430451573995024_7473960282002692779_n.jpg?oh=8667ffcd3ccb66892fcf4e7330f24e61&oe=59B88B8F");
    View v =  inflater.inflate(R.layout.fragment_art, container, false);
    myGrid= (GridView) v.findViewById(R.id.gridViewCategory);
    adapter =new CategoryAdapter(getActivity(),movieList);
    myGrid.setAdapter(adapter);
    return v;
    }

  }

class CategoryAdapter extends BaseAdapter {
   private Context context;
   private ArrayList<String> imageId=new ArrayList<String>();
   CategoryAdapter(Context context,ArrayList<String> imageId){
        this.context=context;
        this.imageId=imageId;
  }
   @Override
   public int getCount() {
    return imageId.size();
}
@Override
public Object getItem(int position) {
    return imageId.get(position);
}
@Override
public long getItemId(int position) {
    return position;
}
class ViewHolder{
    ImageView CategoryImage;
    ViewHolder(View view){
        CategoryImage = (ImageView) view.findViewById(R.id.cat_imageView);
    }
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row=convertView;
    ViewHolder holder=null;
    if(row == null){
        LayoutInflater inflater= (LayoutInflater)    context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        row=inflater.inflate(R.layout.picture_item,parent,false);
        holder = new ViewHolder(row);
        row.setTag(holder);
    }
    else{
        holder=(ViewHolder) row.getTag();
    }   Glide.with(context).load(imageId.get(position)).placeholder(R.drawable.load).int       o(holder.CategoryImage);
       return row;
    }

 }
@覆盖
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
ArrayList movieList=新的ArrayList();
电影列表。添加(“https://scontent-waw1-1.xx.fbcdn.net/v/t1.0-   9/18199348_43045157395024_7473960282002692779_n.jpg?oh=8667ffcd3ccb66892fcf4e7330f24e61&oe=59B88B8F”);
视图v=充气机。充气(R.layout.fragment_艺术,容器,假);
myGrid=(GridView)v.findViewById(R.id.gridViewCategory);
适配器=新类别适配器(getActivity(),movieList);
设置适配器(适配器);
返回v;
}
}
类CategoryAdapter扩展BaseAdapter{
私人语境;
私有ArrayList imageId=新ArrayList();
CategoryAdapter(上下文,ArrayList imageId){
this.context=context;
this.imageId=imageId;
}
@凌驾
public int getCount(){
返回imageId.size();
}
@凌驾
公共对象getItem(int位置){
返回imageId.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
类视图持有者{
图像视图类别图像;
视图保持器(视图){
CategoryImage=(ImageView)view.findViewById(R.id.cat_ImageView);
}
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
ViewHolder=null;
if(行==null){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
行=充气机。充气(右布局。图片项目,父项,假);
支架=新的视图支架(行);
row.setTag(支架);
}
否则{
holder=(ViewHolder)row.getTag();
}Glide.with(context).load(imageId.get(position)).placeholder(R.drawable.load).into(holder.CategoryImage);
返回行;
}
}

异步任务是您的关键

//使用AsyncTask在后台线程中加载慢速图像

new AsyncTask<ViewHolder, Void, Bitmap>() {
    private ViewHolder v;

    @Override
    protected Bitmap doInBackground(ViewHolder... params) {
        v = params[0];
        return mFakeImageLoader.getImage();
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        if (v.position == position) {
            // If this item hasn't been recycled already, hide the
            // progress and set and show the image
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    } }.execute(holder);
newasynctask(){
私人持票人v;
@凌驾
受保护的位图背景(ViewHolder…参数){
v=参数[0];
返回MFakeMageLoader.getImage();
}
@凌驾
受保护的void onPostExecute(位图结果){
super.onPostExecute(结果);
如果(v.position==位置){
//如果此物品尚未回收,请隐藏
//前进,设置并显示图像
v、 progress.setVisibility(View.GONE);
v、 icon.setVisibility(View.VISIBLE);
v、 icon.setImageBitmap(结果);
}
}}.执行(持有人);
也可以在gridview上启用快速滚动。此外,如果要切换到网格的新视图,可以回收不需要的位图

如果这些都没有帮助,那么尝试使用像Glide这样的库


希望这有帮助

感谢您的回复,如果您能解释更多我如何在我的代码中使用
AsyncTask
,我也在使用Glide库,我已经使用了'Glide.fastscrollenabled(true)`但是延迟仍然存在,我相信您的问题是您没有回收位图。您只需保留一堆大数据对象,并靠近主线程!@答:Petrizza Yeeeeees你说得对,当我第一次启动我的应用程序时,它会上载图像,但当我再次运行时,图像会在未加载的情况下出现,因为图像在缓存中对不起,我的英语很差