6

के साथ समर्थन लोडर मैनेजर CursorLoaders और Loadermanagers का उपयोग करने के बारे में मैंने सोचा था कि आपको कर्सर के जीवन चक्र को मैन्युअल रूप से प्रबंधित करने की आवश्यकता नहीं थी। तो मैंने समर्थन पैकेज का उपयोग कर एक एडाप्टर को एक ऑटोकंपलेटटेक्स्टव्यू में जोड़ने के लिए लोडरमेनर का उपयोग किया।IllegalStateException - AutocompleteTextView

यह बहुत अच्छी तरह से काम करता है सिवाय इसके कि यह यादृच्छिक रूप से एक त्रुटि को फेंक देता है "IllegalStateException - पहले से बंद ऑब्जेक्ट को फिर से खोलने का प्रयास"। निश्चित रूप से ऐसा नहीं होना चाहिए यदि हम लोडर प्रबंधक का उपयोग कर रहे हैं?

08-16 22:21:23.244: E/AndroidRuntime(25475): java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT _id, player_name FROM players WHERE (player_name LIKE ?)) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:33) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:82) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:164) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.sqlite.SQLiteCursor.onMove(SQLiteCursor.java:147) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:178) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.CursorWrapper.moveToPosition(CursorWrapper.java:162) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.support.v4.widget.CursorAdapter.getItem(CursorAdapter.java:213) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.widget.AutoCompleteTextView.buildImeCompletions(AutoCompleteTextView.java:1113) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.widget.AutoCompleteTextView.showDropDown(AutoCompleteTextView.java:1072) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.widget.AutoCompleteTextView.updateDropDownForFilter(AutoCompleteTextView.java:950) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.widget.AutoCompleteTextView.onFilterComplete(AutoCompleteTextView.java:932) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:285) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.os.Looper.loop(Looper.java:137) 
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.app.ActivityThread.main(ActivityThread.java:4507) 

क्या गलत हो सकता है पर कोई भी विचार:

package com.bhagwad.tennis; 

import android.appwidget.AppWidgetManager; 
import android.content.Intent; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.LoaderManager.LoaderCallbacks; 
import android.support.v4.content.CursorLoader; 
import android.support.v4.content.Loader; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AutoCompleteTextView; 
import android.widget.Button; 

import com.bhagwad.tennis.TennisSchedule.TennisScheduleColumns; 


public class WidgetConfiguration extends FragmentActivity implements OnClickListener, LoaderCallbacks<Cursor> { 

    Button mSaveWidget; 
    AutoCompleteTextView mPlayerName; 
    int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; 
    String mSelection =""; 
    SimpleCursorAdapter mAdapter; 

    public static String PREFS = "com.bhagwad.tennis.appwidget"; 
    public static final String PREFS_PREFIX_KEY = "prefix_"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.widget_configuration); 

     mPlayerName = (AutoCompleteTextView) findViewById(R.id.edit_filter); 

     mPlayerName.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 

       if (!s.equals("")) 
        mSelection = s.toString(); 
       else 
        mSelection = ""; 

       getSupportLoaderManager().restartLoader(0, null, WidgetConfiguration.this); 



      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       // TODO Auto-generated method stub 

      } 
     }); 

     // Set up the adapter 

     mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, new String[] {TennisScheduleColumns.PLAYER_NAME}, new int[] {android.R.id.text1}, 0); 
     mAdapter.setCursorToStringConverter(new CursorToStringConverter() { 

      @Override 
      public CharSequence convertToString(Cursor c) { 

       return c.getString(c.getColumnIndexOrThrow(TennisScheduleColumns.PLAYER_NAME)); 

      } 
     }); 

     mPlayerName.setAdapter(mAdapter); 

     getSupportLoaderManager().initLoader(0, null, this); 

    } 


    @Override 
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { 

     return new CursorLoader(this, TennisScheduleColumns.CONTENT_URI_PLAYERS, new String[] {TennisScheduleColumns._ID, TennisScheduleColumns.PLAYER_NAME}, TennisScheduleColumns.PLAYER_NAME + " LIKE ?", new String[] {"%"+mSelection+"%"}, null); 

    } 


    @Override 
    public void onLoaderReset(Loader<Cursor> arg0) { 
     mAdapter.swapCursor(null); 

    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     mAdapter.swapCursor(data); 


    } 


} 

यहाँ त्रुटि ढेर है:

यहाँ कोड है?

+1

हालांकि मेरे पास अभी भी कोई समाधान नहीं है, मैंने अभी ऑटोकंपलेटटेक्स्ट व्यू बढ़ाया है, "सुपर" कथन के आस-पास एक कोशिश/पकड़ लूप में त्रुटि को पकड़ लिया है, इसे अनदेखा कर दिया है। मुझे नहीं पता कि यह क्यों हुआ या इसे कैसे संभाला जाए। समस्या सुलझ गयी। हालांकि गन्दा एक और सुरुचिपूर्ण समाधान की सराहना करेंगे। –

+0

मैं यहां कुछ ऐसा कर रहा हूं !! http://stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – toobsco42

+0

@ भागवाड़जल पार्क मैंने आपके पास इस समस्या को हल किया है। टोनी द्वारा प्रस्तावित समाधान (ऑनलोड लोडेड में बंद राज्य की जांच) मेरे लिए काम नहीं करता है। यहां आपकी अंतर्दृष्टि के अनुसार मैंने लिखा रैपर वर्ग है: https://gist.github.com/esilverberg/5606551 – esilver

उत्तर

7

ऑनलोड लोड कभी-कभी मृत कर्सर के साथ बुलाया जाता है - यदि आप कर्सर पर isClosed() के लिए एक टेस्ट डालते हैं तो आप पाएंगे कि आप इसे (कुछ बड़ी संख्या) प्रयासों में बंद कर देंगे।

दुर्भाग्य से 'मानक' कोड में डालने के लिए OnLoadFinished तुरंत करता एडाप्टर पर एक changeCursor() और, अराजकता में अच्छी तरह से, क्या इस प्रकार है, stackdumps, महामारी, आदि

मेरे समाधान नहीं की तुलना में किसी भी खूबसूरत है आपका प्रयास/पकड़ .. बोगस ऑनलोड को अनदेखा करें और अंतिम उपयोगकर्ता को रिक्त यूआई प्राप्त करने का जोखिम दें।

+1

उस बोली के लिए धन्यवाद। इस विशेष मामले के लिए, मैंने loadermanager/कर्सरलोएर को पूरी तरह से हटा दिया है और setfilterqueryprovider के साथ ऐसा करने के लिए एक और तरीका लागू किया है। लेकिन आपका समाधान जाने का सबसे अच्छा तरीका प्रतीत होता है। शायद हम कहीं भी एक बग रिपोर्ट जमा कर सकते हैं? –

संबंधित मुद्दे