关于datebase,cursor的一些异常 android.database.CursorWindowAllocationException: Cursor window allocation of

本文探讨了在Android应用开发过程中遇到的CursorWindowAllocationException错误的原因及解决方法,涉及cursor空判断、数据库关闭、cursor关闭等问题,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原来测试的时候没有报错,现在出现好多蓝色提示,并且有时候程序会崩溃,我出现过以下几个错误

android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed even after closing cursor
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=705 (# cursors opened by this proc=705)
出现这个的话一般是以下几种情况

cursor是否为空没有判断

datebase没有关闭

cursor没有关闭

ok,下面上两段代码:

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * Created by fanyafeng on 2015/7/28/0028.
 */
public class CollectTableCourse {
    private static final String RECORDTABLE = "t_collect";
    private SQLiteDatabase db = null;

    public CollectTableCourse(SQLiteDatabase db) {
        this.db = db;
    }

    public Boolean searchCollect(String v_id) {
        String sql = "SELECT v_id FROM " + RECORDTABLE + " WHERE v_id = ?";
        String searchField[] = new String[]{v_id};
        Cursor result = this.db.rawQuery(sql, searchField);
        if (result != null) {
            result.moveToFirst();
        }
        if (result.getCount() == 0) {
            result.close();
            this.db.close();
            return true;
        } else {
            result.close();
            this.db.close();
            return false;
        }
    }
}
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.cj.dreams.video.R;
import com.cj.dreams.video.bean.VideoListBean;
import com.cj.dreams.video.dbhelper.CollectTableCourse;
import com.cj.dreams.video.dbhelper.GoodTableCourse;
import com.cj.dreams.video.dbhelper.LaughSQLiteOpenHelper;
import com.cj.dreams.video.dbhelper.RecordTableCourse;
import com.cj.dreams.video.dboperate.CollectOperate;
import com.cj.dreams.video.dboperate.GoodOperate;
import com.cj.dreams.video.dboperate.RecordOperate;
import FanYaFeng.L;
import com.cj.dreams.video.util.ListViewImageTaskUtil;
import FanYaFeng.PostUtil;
import com.cj.dreams.video.util.T;

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by fanyafeng on 2015/7/7/0007.
 */
public class VideoListAdapter extends ABaseAdapter {
    private Context context;
    private List<VideoListBean> videoListBeanList;
    private LaughSQLiteOpenHelper laughSQLiteOpenHelper;
    private RecordOperate recordOperate;
    private CollectOperate collectOperate;
    private GoodOperate goodOperate;
    //用来记录播放状态的图标显示,测试
    private ViewHolder holder;


    // 获取当前应用程序所分配的最大内存
    private final int maxMemory = (int) Runtime.getRuntime().maxMemory();
    // 只用五分之一用来做图片缓存
    private final int cacheSize = maxMemory / 5;

    private LruCache<String, Bitmap> mLruCache = new LruCache<String, Bitmap>(
            cacheSize) {

        // 重写sizeof()方法
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // TODO Auto-generated method stub
            // 这里用多少kb来计算
            return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
        }

    };

    public VideoListAdapter(Context context, List<VideoListBean> videoListBeanList) {
        this.context = context;
        this.videoListBeanList = videoListBeanList;

    }

    public void update() {
        notifyDataSetChanged();
    }


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

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

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

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            view = LayoutInflater.from(context).inflate(R.layout.item_activity_video_list, null);
            holder = new ViewHolder();
            view.setTag(holder);
            holder.item_background=(LinearLayout)view.findViewById(R.id.item_background);
            holder.videoListIcon = (ImageView) view.findViewById(R.id.videolist_icon);
            holder.videoListTitle = (TextView) view.findViewById(R.id.videolist_title);
            holder.videoPlayTimes = (TextView) view.findViewById(R.id.videolist_play_times);
            holder.videoCollectTimes = (TextView) view.findViewById(R.id.videolist_collect_times);
            holder.videoGoodTimes = (TextView) view.findViewById(R.id.videolist_good_times);
            holder.videoPlayIcon = (ImageView) view.findViewById(R.id.videolist_play_icon);
            holder.videoCollectIcon = (ImageView) view.findViewById(R.id.videolist_collect_icon);
            holder.videoGoodIcon = (ImageView) view.findViewById(R.id.videolist_good_icon);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        laughSQLiteOpenHelper = new LaughSQLiteOpenHelper(context);
        laughSQLiteOpenHelper.getWritableDatabase();
        if (new RecordTableCourse(laughSQLiteOpenHelper.getReadableDatabase()).searchRecord(videoListBeanList.get(position).getVideoId())) {
            holder.videoPlayIcon.setImageResource(R.drawable.icon_bof);
        } else {
            holder.videoPlayIcon.setImageResource(R.drawable.icon_bof_d);
        }

        holder.videoCollectIcon.setOnClickListener(new collectClick(position));
        if (new CollectTableCourse(laughSQLiteOpenHelper.getReadableDatabase()).searchCollect(videoListBeanList.get(position).getVideoId())) {
            holder.videoCollectIcon.setImageResource(R.drawable.icon_shouc);
        } else {
            holder.videoCollectIcon.setImageResource(R.drawable.icon_shouc_d);
        }

        holder.videoGoodIcon.setOnClickListener(new goodClick(position));
        if (new GoodTableCourse(laughSQLiteOpenHelper.getReadableDatabase()).searchGood(videoListBeanList.get(position).getVideoId())) {
            holder.videoGoodIcon.setImageResource(R.drawable.icon_z);
        } else {
            holder.videoGoodIcon.setImageResource(R.drawable.icon_z_d);
        }

        loadBitmap(videoListBeanList.get(position).getVideoImage(), holder.videoListIcon);
        holder.item_background.getBackground().setAlpha(50);
        holder.videoListTitle.setText(videoListBeanList.get(position).getVideoTitle());
        holder.videoPlayTimes.setText(videoListBeanList.get(position).getVideoPlayTimes());
        holder.videoCollectTimes.setText(videoListBeanList.get(position).getVideoCollectTimes());
        holder.videoGoodTimes.setText(videoListBeanList.get(position).getVideoGoodTimes());
        laughSQLiteOpenHelper.close();
        return view;

    }

    class collectClick implements View.OnClickListener {
        private int position;

        collectClick(int position) {
            this.position = position;
        }

        @Override
        public void onClick(View v) {
            Thread loadThread = new Thread(new LoadThread(videoListBeanList.get(position).getVideoId(), "collect"));
            loadThread.start();
            int collectId = v.getId();
            if (collectId == holder.videoCollectIcon.getId()) {
                if (new CollectTableCourse(laughSQLiteOpenHelper.getReadableDatabase()).searchCollect(videoListBeanList.get(position).getVideoId())) {
                    collectOperate = new CollectOperate(laughSQLiteOpenHelper.getReadableDatabase());
                    collectOperate.insert(videoListBeanList.get(position).getVideoId(), videoListBeanList.get(position).getVideoImage(), videoListBeanList.get(position).getVideoTitle(), videoListBeanList.get(position).getVideoUrl());
                    holder.videoCollectIcon.setImageResource(R.drawable.icon_shouc_d);
                } else {
                    collectOperate = new CollectOperate(laughSQLiteOpenHelper.getReadableDatabase());
                    collectOperate.delete(videoListBeanList.get(position).getVideoId());
                    holder.videoCollectIcon.setImageResource(R.drawable.icon_shouc);
                }
                notifyDataSetChanged();
                laughSQLiteOpenHelper.close();
            }
        }
    }

    class goodClick implements View.OnClickListener {
        private int position;

        goodClick(int position) {
            this.position = position;
        }

        @Override
        public void onClick(View v) {
            Thread loadThread = new Thread(new LoadThread(videoListBeanList.get(position).getVideoId(), "praise"));
            loadThread.start();
            int playId = v.getId();
            if (playId == holder.videoGoodIcon.getId()) {

                if (new GoodTableCourse(laughSQLiteOpenHelper.getReadableDatabase()).searchGood(videoListBeanList.get(position).getVideoId())) {
                    goodOperate = new GoodOperate(laughSQLiteOpenHelper.getReadableDatabase());
                    goodOperate.insert(videoListBeanList.get(position).getVideoId());
                    holder.videoGoodIcon.setImageResource(R.drawable.icon_z_d);
                } else {
                    goodOperate = new GoodOperate(laughSQLiteOpenHelper.getReadableDatabase());
                    goodOperate.delete(videoListBeanList.get(position).getVideoId());
                    holder.videoGoodIcon.setImageResource(R.drawable.icon_z);
                }
                notifyDataSetChanged();
                laughSQLiteOpenHelper.close();
            }
        }
    }


    private void loadBitmap(String urlStr, ImageView image) {

        ListViewImageTaskUtil asyncLoader = new ListViewImageTaskUtil(image, mLruCache);// 一个异步图片加载对象
        Bitmap bitmap = asyncLoader.getBitmapFromMemoryCache(urlStr);// 首先从内存缓存中获取图片
        if (bitmap != null) {
            image.setImageBitmap(bitmap);// 如果缓存中存在这张图片则直接设置给ImageView
        } else {
            image.setImageResource(R.drawable.wait);// 否则先设置成默认的图片
            asyncLoader.execute(urlStr);// 然后执行异步任务AsycnTask 去网上加载图片
        }
    }

    class LoadThread implements Runnable {
        private String id;
        private String type;

        LoadThread(String id, String type) {
            this.id = id;
            this.type = type;
        }

        @Override
        public void run() {
            loadData(id, type);
        }
    }

    private void loadData(String videoId, String buttonType) {
        Map<String, String> map = new LinkedHashMap<>();
        map.put("videoid", videoId);
        map.put("type", buttonType);
        try {
            String backMsg = PostUtil.postData(BaseUrl + PostVideoInfo, map);
            L.d("运行到此,点赞,收藏加1");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    class ViewHolder {
        LinearLayout item_background;
        ImageView videoListIcon;
        TextView videoListTitle;
        TextView videoPlayTimes;
        TextView videoCollectTimes;
        TextView videoGoodTimes;
        ImageView videoPlayIcon;
        ImageView videoCollectIcon;
        ImageView videoGoodIcon;
    }
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值