2011-07-20 7 views
0

次のコードは、N1で問題なく動作します。しかし、時間から、私は私のユーザーからCrashReportを取得する時に:閉じるカーソル/ AsyncTaskにアクセス

"android.database.StaleDataException: Access closed cursor 
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217) 
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41) 
at android.database.CursorWrapper.getString(CursorWrapper.java:135) 
at at.mikemitterer.android.partnerzodiacs.PartnerZodiacsView.setRelationInfo(PartnerZodiacsView.java:456) 
at at.mikemitterer.android.partnerzodiacs.PartnerZodiacsView.setReleationInfoAfterPostExecute(PartnerZodiacsView.java:449) 
at at.mikemitterer.android.partnerzodiacs.PartnerZodiacsView.access$10(PartnerZodiacsView.java:447) 
at at.mikemitterer.android.partnerzodiacs.PartnerZodiacsView$5.onPostExecute(PartnerZodiacsView.java:440) 
at at.mikemitterer.android.partnerzodiacs.PartnerZodiacsView$5.onPostExecute(PartnerZodiacsView.java:1) 
at android.os.AsyncTask.finish(AsyncTask.java:417) 
at android.os.AsyncTask.access$300(AsyncTask.java:127) 

コード部分がある:それは私に再現できないと述べて

public void updateRelationInfoAsync() { 
    new AsyncTask<Void, Void, Void>() { 
     private Cursor cursorRelation = null; 

     @Override 
     protected Void doInBackground(final Void... voids) { 
      try { 
       cursorRelation = ProviderQueries.getInstance().getRelationByID(PartnerZodiacsView.this, firstRelationUID, secondRelationUID); 
      } 
      catch (final RelationNotSetException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(final Void result) { 
      super.onPostExecute(result); 
      setReleationInfoAfterPostExecute(cursorRelation); 
      cursorRelation = null; 
     } 

    }.execute(); 
} 

private synchronized void setReleationInfoAfterPostExecute(final Cursor cursorRelation) { 
    if (cursorRelation != null && (!cursorRelation.isClosed())) { 
     setRelationInfo(cursorRelation); 
     setRatings(cursorRelation); 
     cursorRelation.close(); 
    } 
} 

private void setRelationInfo(final Cursor cursor) { 
    maininfo.setText(cursor.getString(cursor.getColumnIndex(RelationDAO.Colums.DESCRIPTION))); 

    final String name = cursor.getString(cursor.getColumnIndex(RelationDAO.Colums.RELATIONNAME)); 
    AnalyticsUtils.getInstance(this).trackPageView("/relationdisplayed?name=" + URLEncoder.encode(name)); 
} 

私は、このエラーの原因がわかりませんN1とエミュレータが、より重要なことに、私はCursor.isClosed

答えて

2

doInBackgroundは、常にバックグラウンドスレッドで実行する方法とUIスレッドで実行されますonPostExecute方法を確認する場合は、この現象が発生することができますなぜそれが私には絶対に不明だということです。

カーソルのオブジェクトをバックグラウンドスレッドのスコープに作成しました。onPostExecuteに到達するまでに、バックグラウンドスレッドが閉じられ、カーソルオブジェクトの有効期間が終了している可能性があります。

したがって、カーソルオブジェクトをUIスレッドに作成し、カーソルオブジェクトの参照をASyncTaskに渡します。

これは完全にそれは非常によく、特定の向きの変化のタイミングに関連している可能性が、それは間違いなく、デバイス固有の

1

なっているスレッド背景の閉鎖のタイミングに依存するため:親アクティビティが原因に殺されている場合タスクが実行されている間にオリエンテーションが変更されると、カーソルが非常にうまく閉じられることがあります。

関連する問題