1. 程式人生 > >關於datebase,cursor的一些異常 android.database.CursorWindowAllocationException: Cursor window allocation of

關於datebase,cursor的一些異常 android.database.CursorWindowAllocationException: Cursor window allocation of

原來測試的時候沒有報錯,現在出現好多藍色提示,並且有時候程式會崩潰,我出現過以下幾個錯誤

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;
    }
}









相關推薦

關於datebasecursor一些異常 android.database.CursorWindowAllocationException: Cursor window allocation of

原來測試的時候沒有報錯,現在出現好多藍色提示,並且有時候程式會崩潰,我出現過以下幾個錯誤 android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb faile

Android TabLayout在與viewpager AppBarLayout一起使用時出現tab選中後下劃線滑動緩慢卡頓異常解決方案

今天早上剛測試發現的一個問題,之前沒有注意到,特別尷尬感覺,之前經常使用TabLayout和viewpager聯動切換碎片,異常的情況如下圖展示: 佈局程式碼如下: <?xml version="1.0" encoding="utf-8"?> <android.s

Android Studio更新成2.3以後Gradle大坑拯救gradle安裝異常解決辦法

Studio更新一次能要了我半條命,我的Studio每次都很幸運地出現這樣那樣的問題,這次也不例外。 更新完2.3以後就一直Refreshing。而且大腦遲鈍的我一個多小時以後才發現…… 就像這樣 好吧,問題來了就解決問題。 主要參考部落格:http://blog.csdn.net/

android webview全面使用講解以及一些遇到的坑

#簡介 webview是在android中渲染web頁面的控制元件,它在android4.4之前是基於webkit引擎,在之後是基於Chromium引擎。 webview的基本使用 當前使用ide為:AndroidStudio3.0,測試機為華為榮

Android匯入三方SDK時遇到的一些異常及解決方案

在AndroidStudio中匯入三方SDK時,按照整合文件一步一步來,整合之後開始執行,可能會遇到一些問題,下面我就列舉一下我遇到的三個問題,希望能對大家有所幫助:  第一個:執行之後沒有反應,這時候點開Android Manitor,觀察上面出現的提示: ; 這時候可

升級Android studio3.0之後的一些異常記錄

最近把Android studio升級到了3.1.2版本,踩了很多的坑。本篇部落格記錄一下升級過程中遇到的問題以及解決方案。 本篇文章不會對網路上大部分都有的問題在重複做列舉,如果大家遇到了升級中的其他問題可以看下面兩篇文章: Could not r

android.database.sqlite.SQLiteException: no such table 異常之GreenDao整合

解決方法:升級資料庫版本號dbVersion public class GreenDaoGenerator { public static void main(String[] args) t

解決Android7.0系統 呼叫系統相機、系統播放器播放視訊、切圖相容問題異常android.os.FileUriExposedException

Android7.0以前獲取本地檔案uri用的Uri.fromFile(new File(filePath)); 後會得到一個file://,這種方式呢7.0及以後的系統版本就用不了,且會報一個異常:

Android 配置子Module混淆時遇到的錯誤一些零散技術點總結

概要說明: 1、子Module不能配置混淆,僅僅只能在主Module中配置混淆。 2、主Module配置了混淆,打包成apk後,其他Module的程式碼也會一起混淆。 3、所有Module中的res目錄下的資源都會在打包時合併到主Module的res目錄下對應檔案位置。 4

Android studio開發中遇到的一些異常

1、Gradle: A problem occurred configuring project Weird error message: 1 2 3 4 5 6 Gradle: A pr

Android 7.0使用相機拍照出現FileUriExposedException異常

以前寫的相機模組功能,在7.0手機上遇到錯誤,記錄一下。Android 7.0以下 呼叫方式Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environmen

android訪問靜態頁面出現405異常解決辦法

訪問服務使器URL用IE瀏覽器可以下載,但是用客戶端測試就沒辦法,提示網路錯誤,在客戶端那邊,得到的結果就是405錯誤,這個是nginx返回的。於是,在我的電腦上拿瀏覽器,輸入制定的url,那客戶端模擬器都可以開啟,於是查看了日誌,發現了其中的不同。瀏覽器是用傳送的GET請求,而客戶端是傳送的POST請求。

Android Bitmap圖片縮放優化用canvas替代Matrix進行縮放解決一些錯我

前面用Matrix來縮放Bitmap,發現有些情況下會丟擲錯誤,導致圖片空白。 /** * 縮放 * * @param bm * @param newWidth * @param newHeight *

網上搜集的一些關於Android LOGO圖片

oid logs images ima android l roi bsp blog 技術分享 網上搜集的一些關於Android LOGO圖片

找一幫有趣的人一些有趣的事

中間 領域 打通 為什麽 訪問權限 一點 國外 工作 缺少   想在這個領域裏特別的擅長,走通特別多的細節,達到一種自己滿意的程度。可是回想一下,雖然每次都會繞回來,總的,在這個上邊用的時間還並不是那麽長。也就是說,並不是那麽確定自己可以做的遠。   這件事我並不排斥。而且

js中evalarguments與異常處理的用法-基礎知識總結------彭記(017)

報錯 字符串 nts 字符 number 拖動 ron cnblogs 數組 eval的使用: <script> /*eval的作用: * 1.將字符串當成js代碼來執行 * 2.可以將json格式的字符串轉換為js對象*/

selenium-java解決一些加了顯性等待和隱性等待都不好使的情況以及給UI自動化加上暫停功能

event until rdo 暫停 ati ntop 面板 -1 不想 最近在UI自動化時遇到了,上一步成功操作後沒有響應的情況(動畫加載和瀏覽器加載導致實際沒有問題),導致下一步無法成功操作,所有想在嘗試2次操作後再次進行上一步操作解決這種情況導致的錯誤(其實是不想每一

python網絡編程通過服務名稱和會話類型(tcpudp)獲取端口號簡單的異常處理

one span try num python網絡 int 代碼 sys.argv 通過 作為一個php程序員,同時有對網絡方面感興趣,php就比較蛋疼了,所以就抽了些時間看python 之前學python基礎因為工作原因,斷斷續續的看了個基礎,差不多是可以寫代碼了 最近在

Android Database(SQLite)參數綁定問題初探

對比 opc http android hang parsing end intvalue _id 不廢話,先貼一下測試代碼: void test001() { final String path = "/sdcard/test.db";