2011-09-07 70 views
1

我在我的活动中使用了一个自定义列表视图,并试图用值填充它。但是,我得到这个“staledataexception”,这我不undersdtand为什么....android.database.staledataexception:访问已关闭的光标

下面是代码,在标记为“错误在这里”

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 
       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 
+0

您应该使用CursorAdapter,并避免在活动中启动线程。 – njzk2

+0

好..让我试试看..我会再次回来 – Amar

+0

嗨,你可以请指导我如何使用CursorAdapter这个,我怀疑是我从数据库中分配光标的一些值,然后我如何使用它将数据放入ArrayList中,然后在Listadapter中使用它。 – Amar

回答

5

行你似乎出现错误使用managedQuery获取游标。

我在恢复应用程序时遇到问题,由于某些原因,Icecream Sandwich没有正确关闭游标。解决方法是在使用它们之后立即为所有游标执行此操作:

if (cursor != null && !cursor.isClosed()) { 
    myActivity.stopManagingCursor(cursor); 
    cursor.close(); 
} 
+0

ICS不为您管理游标,因为start/stopManagingCursor在API 11中已被弃用。更好的策略是使用LoaderManager 。它还具有将光标加载到后台线程上的优点,使您的应用程序更具响应性。 – emil10001