2011-09-07 67 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