android.database.staledataexception : Access closed cursor
I am using a custom listview in my activity and trrying to populate it with values. But, I am getting this "staledataexception", which i dont undersdtand why....
Here is the code, the error occurs on the line tagged as "error here"
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.upadtemailservr);
headText = (TextView)findViewById(R.id.TextView01);
prefsPrivate = getSharedPreferences(PREFS_PRIVATE,Context.MODE_PRIVATE);
Heading = prefsPrivate.getString(KEY_PRIVATE, "the string not found");
headText.setText("Update Mail Server - "+Heading);
AddNew = (Button)findViewById(R.id.Button01);
AddNew.setOnClickListener(this);
m_orders = new ArrayList<Order>();
//the first tried one... this was not working... so i tried the one writtten next to it.
/*
m_orders = new ArrayList<Order>();
this.m_adapter = new OrderAdapter(this, R.layout.row, m_orders);
this.setListAdapter(this.m_adapter);
*/
//new list adapter
MainList = (ListView)findViewById(R.id.mainlist1);
viewOrders = new Runnable()
{
@Override
public void run() {
// TODO Auto-generated method stub
getOrders();
}
};
Thread thread = new Thread(null, viewOrders, "MagentoBackground");
thread.start();
m_ProgressDialog = ProgressDialog.show(UpdateMailServr.this,
"Please wait...", "Retrieving data ...", true);
m_adapter = new OrderAdapter(this,R.layout.row,m_orders);
MainList.setAdapter(m_adapter);
MainList.setOnItemClickListener(this);
}
private Runnable returnRes = new Runnable(){
@Override
public void run() {
if(m_orders != null && m_orders.size() > 0){
m_adapter.notifyDataSetChanged();
for(int i=0;i<m_orders.size();i++)
m_adapter.add(m_orders.get(i));
}
m_ProgressDialog.dismiss();
m_adapter.notifyDataSetChanged();
}
};
public void getOrders() {
m_orders = new ArrayList<Order>();
adapter1 = new DBAdaptertrial2(this);
adapter1.open();
Cursor cur1 = adapter1.fetchAllMeetings();
cur1.moveToFirst();
for(int i=0;i<cur1.getCount();i++)
{
//******Error here**************
if(Heading.equalsIgnoreCase(cur1.getString(1)))
{
try
{
if(!cur1.getString(5).equals(""))
{
Order o1 = new Order();
o1.setMailserver(cur1.getString(5));
o1.setPriority(cur1.getInt(8));
o1.setIpaddr(cur1.getString(2));
m_orders.add(o1);
}
if(!cur1.getString(6).equals(""))
{
Order o2 = new Order();
o2.setMailserver(cur1.getString(6));
o2.setPriority(cur1.getInt(8));
o2.setIpaddr(cur1.getString(2));
m_orders.add(o2);
}
if(!cur1.getString(7).equals(""))
{
Order o3 = new Order();
o3.setMailserver(cur1.getString(6));
o3.setPriority(cur1.getInt(8));
o3.setIpaddr(cur1.getString(2));
m_orders.add(o3);
}
Thread.sleep(3000);
Log.i("ARRAY", ""+ m_orders.size());
}
catch (Exception e) {
Log.e("BACKGROUND_PROC", e.getMessage());
}
runOnUiThread(returnRes);
}
else
{
cur1.moveToNext();
}
cur1.close();
adapter1.close();
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
viewOrders = new Runnable()
{
@Override
开发者_StackOverflow public void run() {
// TODO Auto-generated method stub
getOrders();
}
};
Thread thread = new Thread(null, viewOrders, "MagentoBackground");
thread.start();
m_ProgressDialog = ProgressDialog.show(UpdateMailServr.this,
"Please wait...", "Retrieving data ...", true);
}
// End of all the list stuff
You seem to be getting the cursors using managedQuery.
I had problems with restoring an application, which for some reason in Icecream Sandwich did not close the cursors properly. The fix was to do this for all cursors right after using them:
if (cursor != null && !cursor.isClosed()) {
myActivity.stopManagingCursor( cursor );
cursor.close();
}
精彩评论