Android erreur: Impossible d'effectuer cette opération car le pool de connexion a été fermée
J'ai cherché sur StackOverflow et le web pour répondre à cette question, mais je ne pouvais pas trouver une réponse. Quand je lance mon application sur pain d'épice, il fonctionne très bien. Mais lorsque je l'exécute sur l'article 4.2.2, j'ai cette erreur: java.lang.IllegalStateException Cannot perform this operation because the connection pool has been closed
J'ai un SherlockFragmentActivity qui contient deux fragments.
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) {
}
}
}
J'ai été coincé sur cette pour HEURES (pas de blagues), et il serait vraiment reconnaissant de toute aide. Merci encore.
Post entier stacktrace. Cette erreur signifie que l'application se ferme db quelque part et une autre base de données de connexion se produit après que mais db est fermé
vous devez supprimer fermer l'opération . essayez en supprimant close() . cette erreur est due à la fermeture de la db.
vous devez supprimer fermer l'opération . essayez en supprimant close() . cette erreur est due à la fermeture de la db.
OriginalL'auteur AndroidDev | 2013-04-17
Vous devez vous connecter pour publier un commentaire.
SQLiteConnectionPooling a été ajouté dans l'après Android 4.1. Alors que dans les versions précédentes d'un objet curseur serait tout simplement essayer de rouvrir une base de données si une requête ou à une autre opération a été faite sur une connexion qui a été fermé, avec le Regroupement de connexions, une exception est levée. Le NotesDBAdapter est probablement un retour qui peut avoir cassé la compatibilité avec l'article 4.2.2.
comment avez-vous résoudre @FerranNegre
J'ai écrit à ce sujet stackoverflow.com/questions/23293572/... . Lire la réponse et mon commentaire sur cette réponse 🙂
OriginalL'auteur user2312380
J'ai eu le même problème, parce que plusieurs threads accédé à la même
SQLiteOpenHelper
et, par conséquent, ouvert et fermé la connexion simultanément.Je l'ai résolu en ajoutant un
userCount
attribut à l'aide. Maintenant, à l'aide seulement ferme la connexion, si leuserCount
est zéro, c'est à dire pas d'autres threads sont actuellement à l'aide de la base de données.OriginalL'auteur andrino