在异步任务中,构造函数是否首先在doInBackground上运行?

时间:2018-10-20 12:44:51

标签: android android-asynctask

我只是使用一种简单的逻辑来获取联系人姓名(大家都可以使用if语句在下面的代码中看到)。但是,如果if语句不起作用。问题是我正在比较联系人s1字符串带有s2的名称,我从构造函数中获取它,并且我非常有信心s1包含与s2相同的名称。因此,它首先运行构造函数或在后台执行?。用这种方法。

private class findContacts extends AsyncTask<Void, String, String> {
    String contactName;
    public findContacts(String contactName) {
        this.contactName = contactName;
    }

    @Override
    protected String doInBackground(Void... voids) {

        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null,
                null,
                null,
                null);

        String name = null,phoneNumber=null;

        if (phones != null) {
            while (phones.moveToNext())
            {
                name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));



                System.out.println("1st name "+name.toLowerCase()+" 2nd name"+contactName.toLowerCase()+" both are same ?"+name.toLowerCase().contains(contactName.toLowerCase()));

                if (name.toLowerCase().equals(contactName.toLowerCase())){   // The problem lies here 
                    System.out.println(name+" "+phoneNumber);
                    phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                }else {
                   // newPhoneNum="123456";
                }

            }

            phones.close();
        }
        return phoneNumber;

    }

enter image description here

2 个答案:

答案 0 :(得分:2)

AsyncTask#doInBackground()仅在调用execute()对象时被调用。那就是它异步工作的方式。它当然会在构造函数之后调用。在doInBackground中调试代码。

注意:-您也可以像某些普通的非静态方法一样直接调用doInBackground(),但这没有任何意义,因为这样就不会异步调用。 您的呼叫应为:

new findContacts ("Alice").execute()

类名应为FindContacts而不是findContactsJava naming Conventions)。

答案 1 :(得分:1)

构造器内部的指令在实例化之后立即在所有其他指令之前执行。当执行异步任务时,将调用doInBackground。