मुझे कोई समस्या है और मुझे यकीन नहीं है कि इसे कैसे पहुंचाया जाए। मेरे ऐप में एक गतिविधि में कई AsyncTask
एस हैं जो एकल SQLiteOpenHelper
तक पहुंचते हैं। मैं onCreate()
में सहायक को प्रारंभ और खोलता हूं और मैं इसे onStop()
में बंद कर रहा हूं। मैं यह भी जांचता हूं कि इसे onResume()
में प्रारंभ किया गया है या नहीं।एंड्रॉइड AsyncTask और SQLite डीबी इंस्टेंस
चूंकि मैंने अपना ऐप प्रकाशित किया है, इसलिए मुझे doInBackground
में नल अपवाद के साथ त्रुटियों की संख्या मिली है जहां मैं डीबी सहायक का उपयोग करने का प्रयास करता हूं। मुझे पता है कि ऐसा इसलिए होता है क्योंकि डीबी बंद है (onStop()
) doInBackground
से ठीक पहले, उचित मेला कहा जाता है।
मेरा सवाल है, मुझे डीबी कनेक्शन कहां बंद करना चाहिए? क्या गतिविधि में डीबी सहायक के एक उदाहरण का उपयोग करना और इसे एकाधिक धागे (AsyncTasks
) से एक्सेस करना सही है? या मुझे प्रत्येक AsyncTask
के लिए अलग डीबी सहायक उदाहरण का उपयोग करना चाहिए?
यह मेरा गतिविधि का एक सरलीकृत कंकाल है:
public class MyActivity extends Activity{
private DbHelper mDbHelper;
private ArrayList<ExampleObject> objects;
@Override
public void onStop(){
super.onStop();
if(mDbHelper != null){
mDbHelper.close();
mDbHelper = null;
}
}
@Override
public void onResume(){
super.onResume();
if(mDbHelper == null){
mDbHelper = new DbHelper(this);
mDbHelper.open();
}
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
DbHelper mDbHelper = new DbHelper(this);
mDbHelper.open();
}
private class DoSomething extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... arg0) {
objects = mDbHelper.getMyExampleObjects();
return null;
}
@Override
protected void onPostExecute(final Void unused){
//update UI with my objects
}
}
private class DoSomethingElse extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... arg0) {
objects = mDbHelper.getSortedObjects();
return null;
}
@Override
protected void onPostExecute(final Void unused){
//update UI with my objects
}
}
}
तो मूल रूप से मुझे doInBackground में (! IsCancelled) {} का उपयोग करना चाहिए और लूप के अंदर सभी गणना करना चाहिए? – Marqs
हां, और अपने मुख्य थ्रेड में getStatus() को यह सुनिश्चित करने के लिए जांचें कि AsyncTask समाप्त हो गया है। –
ठीक है लेकिन अगर मैं इसे ऑनस्टॉप() में जांचता हूं और यह समाप्त नहीं हुआ है? मैं डीबी कनेक्शन कहां बंद करूंगा? – Marqs