【问题标题】:android Sqlite IllegalStateException on AsyncTaskandroid Sqlite IllegalStateException on AsyncTask
【发布时间】:2014-08-04 06:19:29
【问题描述】:

大家好。

所以,我有一个 AsyncTask 从图像中计算高斯模糊。使用 Blob 字段从 SQLite 检索原始图像数据,过滤后的图像也存储在 SQLite 中。这是代码(setQuizData 是执行此操作的函数):

public class SaveFilterTask  extends AsyncTask<Void, Void, Void>{

private Context mContext;
private Context mApplicationContext;
private Quiz mQuiz;     

public SaveFilterTask(Context context, Quiz quiz, Context applicationContext) {
    super();
    this.mContext = context;
    this.mApplicationContext = applicationContext;
    this.mQuiz = quiz;
}

@Override
protected Void doInBackground(Void... arg0) {
    try {
        setQuizData(mQuiz);
    } catch (UnsupportedEncodingException e) {
        cancel(true);
    }
    return null;
}

@Override
protected void onCancelled() {
    Toast toast = Toast.makeText(mContext, R.string.error_loading_quiz, Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.CENTER, 0, 0);
    toast.show();
}

@Override
protected void onPreExecute() {
    if(!((Activity)mContext).isFinishing()){
        ((MainActivity)mContext).showDialog();
    }
}

protected void onPostExecute(Void args) {

    if(!((Activity)mContext).isFinishing()){
        ((MainActivity)mContext).hideDialog();
    }

    Intent solveQuizIntent = new Intent(mContext, SolveQuizActivity.class);
    solveQuizIntent.putExtra(
            QuizConstants.KEY_PARCELABLE_FINISHED_QUIZ, mQuiz);
    solveQuizIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mContext.startActivity(solveQuizIntent);
}

private void setQuizData(Quiz quiz) throws UnsupportedEncodingException {
    if(quiz.getType().equals(QuizConstants.TYPE_PHOTO)){
        QuizDataSource quizdatasource = new QuizDataSource(mApplicationContext);
        quizdatasource.open();
        String data = quizdatasource.getData(quiz.getId());
        quizdatasource.close();
        QuizDataSource quizdatasource2 = new QuizDataSource(mApplicationContext);
        quizdatasource2.open();
        String filterData = quizdatasource2.getDataFilter(quiz.getId());
        quizdatasource2.close();

        String filter = quiz.getFilter();
        if(filter != null){
            if(!filter.equals(QuizConstants.FILTER_DEFAULT)){
                Bitmap original = decodeImage(data);                                    
                if(filterData == null){         
                    data = FilterManager.applyFilter(original, quiz.getFilter());
                    Log.d("FilterManager","Data: "+ data);
                    Log.d("FilterManager","Id: "+ quiz.getId());
                    QuizDataSource quizdatasourceW = new QuizDataSource(mApplicationContext);
                    quizdatasourceW.open();
                    quizdatasourceW.setDataFilter(quiz.getId(), data);
                    quizdatasourceW.close();
                }                   
            }
        }           
    }
}


private static Bitmap decodeImage(String data) {         
    byte[] b = Base64.decode(data, Base64.DEFAULT);                 
    return BitmapFactory.decodeByteArray(b, 0, b.length);
}

}

这个任务是从我的 Activity 中调用的,像这样:

SaveFilterTask sftask = new SaveFilterTask(this, quiz, getApplicationContext());
sftask.execute();

我不知道为什么有时(随机)我会收到此错误:

0java.lang.RuntimeException: An error occured while executing doInBackground()
1at android.os.AsyncTask$3.done(AsyncTask.java:300)
2at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
3at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
4at java.util.concurrent.FutureTask.run(FutureTask.java:242)
5at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
6at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
7at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
8at java.lang.Thread.run(Thread.java:841)
9Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/Data.db
10at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
11at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1156)
12at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
13at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200)
14at QuizDataSource.getDataFilter(QuizDataSource.java:119)
15at SaveFilterTask.setQuizData(SaveFilterTask.java:82)
16at SaveFilterTask.doInBackground(SaveFilterTask.java:39)
17at SaveFilterTask.doInBackground(SaveFilterTask.java:1)

我尝试了不同的方式,使用一个连接,一个连接用于读取操作,一个连接用于写入操作。但是错误仍然存​​在......

有什么想法吗?

谢谢。

【问题讨论】:

    标签: android sqlite android-asynctask illegalstateexception


    【解决方案1】:

    首先你不应该每次都重新初始化 QuazDataSource。

    在构造函数中初始化并使用检查

    if (quizdatasource  == null) {
        quizdatasource = CreateaQuizDataSourceHelper().open;
    }
    

    那么你应该始终确保关闭它,即使它失败了。

    Cursor cursor = null;
    try {
      if (quizdatasource  == null) {
     quizdatasource = CreateaQuizDataSourceHelper().open;
      } 
      cursor= quizdatasource.rawQuery(...);
    } catch (Exception e) { e.printStackTrace(); }
    finally {
      if (quizdatasource != null) { quizdatasource.close(); }
    }
    

    至少通过将验证放在 finally 块中来确保您的游标也已关闭。

    if (cursor != null) { cursor.close; } 
    

    那么你不应该得到多个实例。

    您还应该为您的数据库创建一个 SINGLETON 实例,以确保它只能被一次访问。

    Helper 本身可能有这样一个 open 方法来确保它使用相同的连接。

        public SQLiteDatabase open() {
        SQLiteDatabase sqLiteDatabase = null;
        try {
    
            try {
                sqLiteDatabase = this.getDatabaseConnection();
            } catch (SQLiteException e) {
                e.printStackTrace();
                DataBaseConnectionPool.DbHelper DbHelper = this.dbHelper;
                if (DbHelper != null) {
                    return this.dbHelper.getReadableDatabase();
                }
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sqLiteDatabase;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-30
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多