0
votes

when I tried to fetch contacts in the onCreate method using the following code ,

Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,ContactsContract.Contacts.DISPLAY_NAME);
    if (c.getCount()>0) {
        Log.e("Number of contacts :",String.valueOf(c.getCount()));
        while (c.moveToNext()) {
            Log.i("Contacts", c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
        }
    }

it worked.But when i moved the code to the asyncTask- doInBackground it is giving IllegalStateException. Here is my code

protected ArrayList<String> doInBackground(Void... params) {
        Cursor c = mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null ,null,null,ContactsContract.Contacts.DISPLAY_NAME);
        ArrayList<String> x = new ArrayList<>();
        if (c.getCount() > 0) {
            StringBuilder sb = new StringBuilder();
            while (c.moveToNext()) {
                sb.append(c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
                x.add(sb.toString());
                Log.i("Contacts",sb.toString());
            }
        }
        return x;
    }

Here ismy logCat output

E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:299)
        at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
        at java.util.concurrent.FutureTask.run(FutureTask.java:137)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
        at java.lang.Thread.run(Thread.java:856)
 Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
        at android.database.CursorWindow.nativeGetString(Native Method)
        at android.database.CursorWindow.getString(CursorWindow.java:434)
        at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
        at android.database.CursorWrapper.getString(CursorWrapper.java:114)
        at akshara.xcontacts.adapters.ContactsListAdapter$ContactsLoader.doInBackground(ContactsListAdapter.java:100)
        at akshara.xcontacts.adapters.ContactsListAdapter$ContactsLoader.doInBackground(ContactsListAdapter.java:77)
        at android.os.AsyncTask$2.call(AsyncTask.java:287)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

            at java.util.concurrent.FutureTask.run(FutureTask.java:137)             at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)             at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)             at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)             at java.lang.Thread.run(Thread.java:856)

Can anyone tell What is wrong in my code?

1
Your doInBackground method returns x. What are you doing of x? - Apurva
@Apurva, ArrayList<String> x = new ArrayList<>(); , declared in line 3 - Sony
I see you have initialized x but I want to know how are you using it? - Apurva
Just passing the ArrayList to the onPostExexute() and it calls a function, setData(ArrayList<String> data) in the adapter class to set data and calls notifyItemRangeChanged(0,data.size()) .But how the use of x is related to the exception. - Sony
your code is working for me! but look at this Answer - Harry's Lab

1 Answers

-1
votes

Be sure to instantiate mContext before execute the AsyncTask

If doesn't work try This:

Use ArrayList<String> x = new ArrayList<String>();

Instead of:

ArrayList<String> x = new ArrayList<>();