Android java-> kotlin преобразование не удается для приемника вещания - PullRequest
1 голос
/ 23 октября 2019

Я пытаюсь преобразовать приведенный ниже код из Java в Kotlin.

public class CreateShortcut extends Activity {
    class WaitFor extends AsyncTask<Void,Void,Void> {
        final int waitPeriod;
        private WaitFor (int N) {
            this.waitPeriod = N * 1000;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            try {
                Thread.sleep(waitPeriod);
                Intent bi = new Intent(shortcutId);
                bi.putExtra("msg", "deny");
                sendBroadcast(bi);
            }
            catch (InterruptedException ignore) {
            }
            return null;
        }
    }
...

Это преобразованный Kotlin.

class CreateShortcut : AppCompatActivity() {

    private class WaitFor (N: Int) : AsyncTask<Void, Void, Void>() {
        val waitPeriod: Int = N * 1000
        override fun doInBackground(vararg voids: Void): Void? {
            try {
                Thread.sleep(waitPeriod.toLong())
                val bi = Intent(shortcutId)
                bi.putExtra("msg", "deny")
                sendBroadcast(bi)
            } catch (ignore: InterruptedException) { /* Ignore */ }
            return null
        }
    }

Моя проблема заключается в том, что sendBroadcast в коде Kotlinявляется неразрешенной ссылкой.

sendBroadcast определен в контексте, и если я изменю эту строку кода так:

(this as CreateShortcut).sendBroadcast(bi)

Линт предупреждает, что «приведение никогда не может быть успешным», но кодработает просто отлично.

Я попробовал квалифицированное this (то есть this @ CreateShortcut), и @CreateShortcut появляется нерешенным. Также только this.sendBroadcast (намерение) также не разрешен.

Примеры получателей широковещательной рассылки Kotlin, которые я нашел в Интернете, просто используют неквалифицированный "sendBroadcast", но обычно они просто вызывают из функций в классе активности и не вызываютиз внутреннего класса в деятельности.

Я застрял. Любые предложения ??

Спасибо Стив С.

1 Ответ

4 голосов
/ 23 октября 2019

Это происходит потому, что по умолчанию в Kotlin вложенный класс является статическим, а в Java - нет. Вы должны квалифицировать его как inner, чтобы воспроизвести поведение вашего кода Java (нестатическое). В статическом вложенном классе вы не можете получить доступ к нестатическим членам внешнего класса.

private inner class WaitFor (N: Int) : AsyncTask<Void, Void, Void>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...