0

我正在尝试列出移动设备中的所有联系人。到目前为止一切正常,但是当我想到在其中运行我的代码时AsyncTask,屏幕上什么也没有。

这是代码片段

protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_call_list);

    lvCallList = (ListView) findViewById(R.id.lv_call_list);

    new AsyncTask<Void, Void, Void>() 
    {
        @Override
        protected void onPreExecute() 
        {
            pd = ProgressDialog.show(CallListActivity.this,
                    "Loading..", "Please Wait", true, false);
        }// End of onPreExecute method

        @Override
        protected Void doInBackground(Void... params) 
        {
            getContacts();

            return null;
        }// End of doInBackground method

        @Override
        protected void onPostExecute(Void result)
        {
            pd.dismiss();

            lvCallList.setAdapter(new CustomAdapter(CallListActivity.this));

        }//End of onPostExecute method
    }.execute((Void[]) null);
     count = this.displayContactName.size();
    thumbnailsselection = new boolean[count];
}


private void getContacts()
{
    ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, null);
    if (cur.getCount() > 0)
    {
        while (cur.moveToNext())
        {
            String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            this.displayContactName.add(name);
            if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
            {
                Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                        null,
                                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
                                        new String[]{id}, 
                                        null);
                while (pCur.moveToNext())
                {
                    String phoneNumber = pCur.getString(pCur.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));
                    this.displayContactNumber.add(phoneNumber);
                } 
                pCur.close();
            }
        }
    }
}

 public class CustomAdapter extends BaseAdapter 
{
    /*
     * Variables Declaration section
     */
    private Context mContext;

    public CustomAdapter(Context context) 
    {
        mContext = context;
    }//End of CustomAdapter constructor

    public int getCount() 
    {
        return count;
    }//End of getCount method

    public Object getItem(int position) 
    {
        return position;
    }//End of getItem method

    public long getItemId(int position) 
    {
        return position;
    }//End of getItemId method

    public View getView(int position, View convertView, ViewGroup parent) 
    {

        return convertView;
    }//End of getView method
}//End of CustomAdapter instance inner class

class ViewHolder 
{
    TextView textviewName;
    TextView textviewNumber;
    CheckBox checkbox;
    int id;
}//End of ViewHolder instance inner class

displayContactName使用断点的值pd.dismiss();

displayContactName  ArrayList  (id=830007844896)    
array   Object[12]  (id=830007907208)   
    [0] "Rrs" (id=830007907144) 
    [1] "Fgsd" (id=830007920424)    
    [2] null    
    [3] null    
    [4] null    
    [5] null    
    [6] null    
    [7] null    
    [8] null    
    [9] null    
    [10]    null    
    [11]    null    
modCount    2   
size    2   

我不知道我的代码有什么问题,当我不使用时,AsyncTask我的代码工作得很好,但是当我使用时,AsyncTask问题就来了。请帮我解决这个难题。

提前致谢。

4

4 回答 4

4

您无法在doInbackground. 您应该在 ui 线程上更新 ui。将适配器设置在onPostExecute.

您也可以使用runOnUiThread.

例子

显示联系人姓名。

public class MainActivity extends Activity {

    ListView lvCallList;
    ProgressDialog pd;
    ArrayList<String> aa = new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lvCallList = (ListView) findViewById(R.id.list);

        new AsyncTask<Void, Void, Void>() 
        {
            @Override
            protected void onPreExecute() 
            {
                pd = ProgressDialog.show(MainActivity.this,
                        "Loading..", "Please Wait", true, false);
            }// End of onPreExecute method

            @Override
            protected Void doInBackground(Void... params) 
            {
                getContacts();

                return null;
            }// End of doInBackground method

            @Override
            protected void onPostExecute(Void result)
            {
                pd.dismiss();
             ArrayAdapter<String>   arrayAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,aa);
             lvCallList.setAdapter(arrayAdapter);

            }//End of onPostExecute method
        }.execute((Void[]) null);
    }
        private void getContacts()
        {
            ContentResolver cr = getContentResolver();
            Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, null);
            if (cur.getCount() > 0)
            {
                while (cur.moveToNext())
                {
                    String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                    String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

                    aa.add(name);
                    if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
                    {
                        Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                                null,
                                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
                                                new String[]{id}, 
                                                null);
                        while (pCur.moveToNext())
                        {
                            String phoneNumber = pCur.getString(pCur.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));
                          //  this.displayContactNumber.add(phoneNumber);
                        } 
                        pCur.close();
                    }
                }
            }
        }
    }

在我的手机上截图

在此处输入图像描述

编辑:2

public class MainActivity extends Activity {

    ListView lvCallList;
    ProgressDialog pd;
    ArrayList<String> aa = new ArrayList<String>();
    ArrayList<String> num= new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lvCallList = (ListView) findViewById(R.id.list);

        new AsyncTask<Void, Void, Void>() 
        {
            @Override
            protected void onPreExecute() 
            {
                pd = ProgressDialog.show(MainActivity.this,
                        "Loading..", "Please Wait", true, false);
            }// End of onPreExecute method

            @Override
            protected Void doInBackground(Void... params) 
            {
                getContacts();

                return null;
            }// End of doInBackground method

            @Override
            protected void onPostExecute(Void result)
            {
                pd.dismiss();
                CustomAdapter cus = new CustomAdapter(MainActivity.this);
               // ArrayAdapter<String>   arrayAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,aa);
             lvCallList.setAdapter(cus);

            }//End of onPostExecute method
        }.execute((Void[]) null);
    }
        private void getContacts()
        {
            ContentResolver cr = getContentResolver();
            Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, null);
            if (cur.getCount() > 0)
            {
                while (cur.moveToNext())
                {
                    String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                    String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

                    aa.add(name);
                    if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
                    {
                        Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                                null,
                                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
                                                new String[]{id}, 
                                                null);
                        while (pCur.moveToNext())
                        {
                            String phoneNumber = pCur.getString(pCur.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));
                            num.add(phoneNumber);
                        } 
                        pCur.close();
                    }
                }
            }
        }

        public class CustomAdapter extends BaseAdapter 
        {
            /*
             * Variables Declaration section
             */
            private Context mContext;

            public CustomAdapter(Context context) 
            {
                mContext = context;
            }//End of CustomAdapter constructor

            public int getCount() 
            {
                return aa.size();
            }//End of getCount method

            public Object getItem(int position) 
            {
                return position;
            }//End of getItem method

            public long getItemId(int position) 
            {
                return position;
            }//End of getItemId method

            public View getView(int position, View convertView, ViewGroup parent) 
            {
                ViewHolder holder;
                final int pos = position;

                if (convertView == null) 
                {
                    holder = new ViewHolder();

                    convertView = LayoutInflater.from(mContext).inflate(R.layout.display_contact, null);
                    holder.textviewName = (TextView) convertView.findViewById(R.id.textView1);
                    holder.textviewNumber = (TextView) convertView.findViewById(R.id.textView2);
                    holder.checkbox = (CheckBox) convertView.findViewById(R.id.checkBox1);

                    convertView.setTag(holder);
                }//End of if condition
                else
                {
                    holder = (ViewHolder) convertView.getTag();
                }//End of else

                holder.checkbox.setId(position);
                holder.textviewName.setId(position);
                holder.textviewNumber.setId(position);


                holder.textviewName.setText(aa.get(position));
                holder.textviewNumber.setText("No. "+num.get(position));

                holder.id = position;

                return convertView;
            }//End of getView method
        }//End of CustomAdapter instance inner class

        static class ViewHolder 
        {
            TextView textviewName;
            TextView textviewNumber;
            CheckBox checkbox;
            int id;
        }

}
于 2013-07-26T09:50:41.600 回答
0

您不能在非 UI 线程中触摸视图。您必须在 onPostExecute(); 中设置适配器;

使用这个:(另外,我希望你把你的联系人保存在某个地方,因为我在你的代码段中没有看到联系人变量)

new AsyncTask<Void, Void, Void>() 
{

    @Override
    protected void onPreExecute() 
    {
        pd = ProgressDialog.show(CallListActivity.this,
                "Loading..", "Please Wait", true, false);
    }// End of onPreExecute method

    @Override
    protected Void doInBackground(Void... params) 
    {
        getContacts();
        return null;
    }// End of doInBackground method

    @Override
    protected void onPostExecute(Void result)
    {
        arrayAdapter = new ArrayAdapter<String>(CallListActivity.this, R.layout.display_contacts,R.id.tv_single_contact_number,displayContactName);
        lvCallList.setAdapter(new CustomAdapter(CallListActivity.this));
        pd.dismiss();

    }//End of onPostExecute method
}.execute((Void[]) null);
于 2013-07-26T09:50:13.193 回答
0

您正在尝试在未在 UI 线程上运行的 doInBackground 中调用 setAdapter。您必须将联系人加载的结果从 doInBackground(..) 传递到 onPostExcecute(..) ,然后您可以创建一个适配器并将其设置在列表视图中。

于 2013-07-26T09:53:28.627 回答
0

我发现了问题,我在设置适配器后尝试初始化count,这就是问题所在,感谢 stackoverflow 和 @Raghunandan

        protected void onPostExecute(Void result)
        {
            count = displayContactName.size();
            thumbnailsselection = new boolean[count];
            lvCallList.setAdapter(new CustomAdapter(CallListActivity.this));
            pd.dismiss();
        }//End of onPostExecute method
于 2013-07-26T10:41:15.857 回答