2011-07-20 45 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一直在后台线程中运行,并onPostExecute在UI线程上运行的方法,这可能发生。

您已经在后台线程作用域中创建了游标对象,到达onPostExecute时,后台线程可能已关闭,从而结束游标对象的生存期。

因此,在UI线程中创建游标对象,将游标对象的引用传递给ASyncTask。

因为这完全取决于后台的关闭正线程绝对是成为特定设备

1

它很可能涉及到的具体方位变化的时间:如果父活动因杀害在任务运行时方向发生变化,光标可能会关闭。