AsyncTask возвращает нулевое значение в основном потоке - PullRequest
0 голосов
/ 09 июля 2020

Вызов переменной, которая должна быть определена через AsyncTask в событии ввода пользователя, всегда возвращает null. Я вызываю AsyncTask() в основном потоке, как показано ниже:

MainActivity. java:

ContactDataRepository contactDataRepository = new ContactDataRepository(mContext);

String name = contactDataRepository.getContactNameByPhoneNumber(
                phoneNumber, null, null, null, null);

ContactDataRepository. java:

public String getContactNameByPhoneNumber(
            String phoneNumber,
            TextView tvName,
            TextView tvNumber,
            TextView tvAvatar,
            ImageView ivDisplayInitials)
            throws ExecutionException, InterruptedException {
        return fetchName(phoneNumber, tvName, tvNumber, tvAvatar, ivDisplayInitials);
    }


private String fetchName(
            String phoneNumber,
            TextView tvName,
            TextView tvNumber,
            TextView tvAvatar,
            ImageView ivDisplayInitials)
            throws ExecutionException, InterruptedException {
        new AsyncTask<Void, Void, String>() {
            @Override
            protected String doInBackground(Void... voids) {

                mPhoneNumber =
                        worksideDatabase.phoneNumberDao().getPhoneNumberByNumberQuery(phoneNumber);

                if (mPhoneNumber != null) {
                    contactName =
                            worksideDatabase
                                    .contactDao()
                                    .getFullNameByContactId(mPhoneNumber.getContactId());
                }

                return contactName;
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);

                // Hack method to transfer the title name to the message
                SharedPreferences sharedPreferences =
                        PreferenceManager.getDefaultSharedPreferences(mContext);
                final SharedPreferences.Editor editor = sharedPreferences.edit();

                if (mPhoneNumber != null) {
                    if (tvName != null) tvName.setText(contactName);
                    if (tvAvatar != null) tvAvatar.setText(getInitials(contactName));
                    if (tvNumber != null) tvNumber.setText(phoneNumber);
                    if (ivDisplayInitials != null) ivDisplayInitials.setVisibility(View.VISIBLE);
                    editor.putString("ToolbarTitle", contactName);
                } else {
                    if (tvName != null) tvName.setText(phoneNumber);
                    editor.putString("ToolbarTitle", phoneNumber);
                }
                editor.apply();
            }
        }.execute().get();

        return contactName;
    }

Могу ли я изменить существующий код, чтобы строка name в MainActivity была правильно определена, или мне придется переписывать AsyncTask?

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