【问题标题】:IllegalStateException while fetching contacts asynchronously异步获取联系人时出现 IllegalStateException
【发布时间】:2015-05-20 08:17:33
【问题描述】:

当我尝试使用以下代码在 onCreate 方法中获取联系人时,

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)));
        }
    }

它起作用了。但是当我将代码移动到 asyncTask-doInBackground 时,它给出了 IllegalStateException。这是我的代码

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;
    }

这是我的 logCat 输出

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)

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

谁能告诉我的代码有什么问题?

【问题讨论】:

  • 您的doInBackground 方法返回x。你对x做了什么?
  • @Apurva, ArrayList&lt;String&gt; x = new ArrayList&lt;&gt;();,在第 3 行声明
  • 我看到你已经初始化了x,但我想知道你是如何使用它的?
  • 只需将ArrayList传递给onPostExexute(),它就会调用适配器类中的一个函数setData(ArrayList&lt;String&gt; data)来设置数据并调用notifyItemRangeChanged(0,data.size())。但是x的使用如何与异常有关。
  • 你的代码对我有用!但是看看这个Answer

标签: android android-asynctask


【解决方案1】:

一定要在执行AsyncTask之前实例化mContext

如果不起作用,试试这个:

使用 ArrayList&lt;String&gt; x = new ArrayList&lt;String&gt;();

代替:

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

【讨论】:

  • mContext在构造函数中赋值,之后执行asyncTask
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多