java - AsyncTask 未运行,logcat 显示为暂停所有线程占用了 : time in ms

标签 java android multithreading performance android-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

最佳答案

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

是正常的,因为它表明 GC 感觉要清理一些内存以将它分配到其他地方,它只是意味着它已经完成了它的工作或者在这里什么都不做,如果你的方法被调用,你可以使用调试检查或不,GC 删除异步线程,因为它感觉释放未使用的内存。

第二行表示它释放了一些内存作为收集时的 GC 的结果。

您应该首先检查您的方法,然后检查光标是否正在返回某个值,或者您的光标有问题。

希望这能解决您的问题。

关于java - AsyncTask 未运行,logcat 显示为暂停所有线程占用了 : time in ms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37694218/

相关文章:

java - 枚举中的默认实体

android - 如何远程唤醒手机?

android - fragment 中的 WebView 不加载任何网页、kotlin、android

Java - 在删除/获取上排序的线程安全集合

java - 随机化球大小的多球程序

java 数组双端队列大小与性能

java - ActiveMq 不自动创建队列

android - ListView 和 onItemClick 创建透明 fragment

c++ - fgets 与 std::fgets - fgets 错过了行

Java 和 Espresso - 无法输入,需要支持输入法或可从类 : class SearchView 分配