В асинхронной задаче конструктор запускается первым из doInBackground? - PullRequest
0 голосов
/ 20 октября 2018

Я просто использую простую логику, чтобы добраться до имени контакта (вы все можете увидеть в приведенном ниже коде, используя оператор if). Но это, если оператор не работает. Проблема в том, что я сравниваю строку s1, которая является контактным лицомимя с s2, которое я получаю из конструктора, и я в высшей степени уверен, что s1 содержит то же самое, что и s2.So, который запускает первый конструктор или выполняет в фоновом режиме?. Если doInBackground, то мне нужно сделать параметр глобальным, а не передаватьв этом методе.

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 голосов
/ 20 октября 2018

Инструкции внутри конструктора выполняются перед всеми остальными инструкциями сразу после создания экземпляра.DoInBackground вызывается при выполнении асинхронной задачи.

0 голосов
/ 20 октября 2018

AsyncTask#doInBackground() вызывается только после вызова execute() для его объекта.Вот как это работает асинхронно.это конечно будет вызвано после конструктора.Отладка вашего кода внутри doInBackground.

ПРИМЕЧАНИЕ: - Вы также можете вызвать doInBackground() напрямую, как обычный нестатический метод, но это не имеет никакого смысла, потому что таким образом он не получит вызов асинхронно.Ваш вызов должен выглядеть следующим образом:

new findContacts ("Alice").execute().

Имя класса должно быть FindContacts, а не findContacts ( Соглашения об именах Java ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...