2013-04-17 34 views
9

StackOverflow ve bu soruyu yanıtlamak için web'de arama yaptım, ancak bir yanıt bulamadım. Uygulamamı Gingerbread'da çalıştırdığımda iyi çalışıyor. Ancak 4.2.2'de çalıştırdığımda şu hatayı alıyorum: java.lang.IllegalStateException Cannot perform this operation because the connection pool has been closed İki parça içeren bir SherlockFragmentActivity var.Android hatası: Bu işlem gerçekleştirilemiyor çünkü bağlantı havuzu kapatıldı

Fragment 1:

public final class TodoFragment extends SherlockListFragment { 
NotesDbAdapter db; 

private static final int DELETE_ID = Menu.FIRST + 1; 

public static TodoFragment newInstance(String s) { 
    TodoFragment fragment = new TodoFragment(); 

    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    db = new NotesDbAdapter(getActivity()); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (container == null) { 
     return null; 
    } 

    return ll; 

} 

Fragment 2:

public final class NotesFragment extends SherlockListFragment { 
NotesDbAdapter db; 
private static final int ACTIVITY_EDIT = 1; 

private static final int DELETE_ID = Menu.FIRST + 1; 

public static NotesFragment newInstance(String content) { 
    NotesFragment fragment = new NotesFragment(); 

    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    db = new NotesDbAdapter(getActivity()); 

    db.open(); 
    if (db.fetchAllNotes().getCount() == 0) { 
     doWelcomeMessage(); 
    } 
    db.close(); 

} 

private void doWelcomeMessage() { 
    // Show welcome dialog 
    startActivity(new Intent(getActivity(), NotesWelcome.class)); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (container == null) { 
     return null; 
    } 

    db = new NotesDbAdapter(getActivity()); 

    db.open(); 
    if (db.fetchAllNotes().getCount() == 0) { 
     doWelcomeMessage(); 
    } 
    db.close(); 


    return ll; 

} 

SherlockFragmentActivity:

public class NotesFragmentActivity extends SherlockFragmentActivity { 

ViewPager mViewPager; 
TabsAdapter mTabsAdapter; 
TextView tabCenter; 
TextView tabText; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mViewPager = new ViewPager(this); 
    mViewPager.setId(R.id.pager); 

    setContentView(mViewPager); 
    ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    mTabsAdapter = new TabsAdapter(this, mViewPager); 

    mTabsAdapter.addTab(bar.newTab().setText("Notes"), NotesFragment.class, 
      null); 
    mTabsAdapter.addTab(bar.newTab().setText("Todo List"), 
      TodoFragment.class, null); 

} 

public static class TabsAdapter extends FragmentPagerAdapter implements 
     ActionBar.TabListener, ViewPager.OnPageChangeListener { 
    private final Context mContext; 
    private final ActionBar mActionBar; 
    private final ViewPager mViewPager; 
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

    static final class TabInfo { 
     private final Class<?> clss; 
     private final Bundle args; 

     TabInfo(Class<?> _class, Bundle _args) { 
      clss = _class; 
      args = _args; 
     } 
    } 

    public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mActionBar = activity.getSupportActionBar(); 
     mViewPager = pager; 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
     TabInfo info = new TabInfo(clss, args); 
     tab.setTag(info); 
     tab.setTabListener(this); 
     mTabs.add(info); 
     mActionBar.addTab(tab); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return mTabs.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     TabInfo info = mTabs.get(position); 
     return Fragment.instantiate(mContext, info.clss.getName(), 
       info.args); 
    } 

    public void onPageScrolled(int position, float positionOffset, 
      int positionOffsetPixels) { 
    } 

    public void onPageSelected(int position) { 
     mActionBar.setSelectedNavigationItem(position); 
    } 

    public void onPageScrollStateChanged(int state) { 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     Object tag = tab.getTag(); 
     for (int i = 0; i < mTabs.size(); i++) { 
      if (mTabs.get(i) == tag) { 
       mViewPager.setCurrentItem(i); 
      } 
     } 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    } 
} 
} 

Ben SAAT (hayır şaka) bu takılıp oldum ve herhangi bir yardım için gerçekten minnettar olur. Tekrar teşekkürler.

+0

Tüm stacktrace gönderilerini. Bu hata uygulama bir yerde db kapatır ve başka bir db bağlantısı bundan sonra gerçekleşir, ancak db – kinghomer

+0

kapalıdır kapatmak için kapatmak gerekir. close() öğesini kaldırarak deneyin. Bu hata db'nin kapatılmasından kaynaklanmaktadır. – Nepster

cevap

8

SQLiteConnectionHooling, Android 4.1'den sonra eklenmiştir. Önceki sürümlerde ise, bir imleç nesnesi, bir bağlantı veya başka bir işlem kapatılmış bir bağlantıda yapıldıysa, bir veritabanı yeniden açılmaya çalışılırken, Bağlantı Havuzu ile bir istisna atılır. NotesDBAdapter büyük olasılıkla 4.2.2 ile uyumluluk bozmuş olabilecek bir gerileme olabilir.

+1

Peki, bunu nasıl çözeceğiz? Bu hatayı bazen uygulamamda alıyorum. Kodun bazı bölümlerinde cursor.moveToFirst() yöntemini çağırdığımda, hatayı alıyorum: Bağlantı havuzu kapatıldığından bu işlem gerçekleştirilemiyor. –

+0

bunu nasıl çözdüğünüzü @FerranNegre –

+0

Bu konuyu http://stackoverflow.com/questions/23293572/android-cannot-perform-this-operation-because-the-connection-pool-has-been-clos/23293930 yazdım ? noredirect = 1 # 23293930. Cevabı okuyun ve bu cevabın konusundaki yorumum :) –

2

Birden çok ileti aynı SQLiteOpenHelper'a eriştiği ve bu nedenle bağlantıyı aynı anda açıp kapattığı için aynı sorunu yaşıyorum.

Yardımcısına bir userCount özniteliği ekleyerek çözdüm. Şimdi yardımcı sadece bağlantıyı kapatır, eğer userCount sıfır ise, diğer bir konu şu anda veritabanını kullanmamaktadır.

+0

lütfen kodu gönderin !!!! –

İlgili konular