AsyncTask没有运行,logcat显示为Suspending所有线程:以ms为单位的时间

时间:2016-06-08 05:50:24

标签: java android multithreading performance android-asynctask

我正在尝试运行asynctask,它可以获取所有联系人信息,但它没有运行并显示为“暂停所有线程花费:时间以毫秒为单位”logcat

SyncContacts obSync = new SyncContacts(this);
new AsyncTask<Void, Void, HashMap<String,String>>() {
            @Override
            protected void onPreExecute() {
            }

            @Override
            protected HashMap<String,String> doInBackground(Void... params) {
                HashMap<String,String> pairs = new HashMap<String, String>();
                try {
                    System.out.println("succcccccccccccccccccces");
                    pairs = obSync.getContacts();
                } catch (JSONException e) {
                    System.out.println("Errrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr");
                    e.printStackTrace();
                }
                return pairs;
            }

            @Override
            protected void onPostExecute(HashMap<String,String> result) {

            }
        }.execute();

这是SyncContacts类

中的方法
public HashMap<String,String> getContacts()  {
    HashMap<String,String> num_name_pairs = new HashMap<>();
    ArrayList<String> numbers = new ArrayList<>();
    ContentResolver cr = c.getContentResolver();
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    if (cursor.moveToFirst()) {
        do {
            String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

            if (Integer.parseInt(cursor.getString(cursor.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 contactNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).trim().replace(" ","");
                    String name = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    if (!numbers.contains(contactNumber)) {
                        numbers.add(contactNumber);
                        num_name_pairs.put(contactNumber,name);
                    }
                    System.out.print("++++" + contactNumber + "->" + name + "...Success");
                }
                pCur.close();
            }

        } while (cursor.moveToNext());
        cursor.close();
    }
    return num_name_pairs;
}

日志猫显示为

06-08 11:09:57.996 21330-21345/com.example.venky.snapbin W/art: Suspending    all threads took: 11.281ms
06-08 11:09:58.015 21330-23820/com.example.venky.snapbin I/art: Explicit concurrent mark sweep GC freed 22422(882KB) AllocSpace objects, 2(38MB) LOS objects, 6% free, 54MB/58MB, paused 1.882ms total 49.168ms

1 个答案:

答案 0 :(得分:1)

这一行 暂停所有线程花了一些时间

是正常的,因为它表明GC感觉要清理一些内存以将其分配到其他地方,它只是意味着它已经完成了它的工作或者没有任何事情要做,你可以使用debug检查你的方法是否被调用或不,GC删除异步线程,因为它释放未使用的内存。

第二行意味着它在收集GC时释放了一些内存。

您应首先检查您的方法,然后光标返回某个值,或者光标有例。

希望这能解决您的问题。