Переопределение OnInit в Visual Basic [дубликат]

Даже после вызова startForeground в Service он сбой на некоторых устройствах, если мы вызываем stopService непосредственно перед вызовом onCreate. Итак, я исправил эту проблему, запустив службу с дополнительным флагом:

Intent intent = new Intent(context,
                YourService.class);
intent.putExtra("request_stop", true);
context.startService(intent);

и добавил проверку onStartCommand, чтобы проверить, действительно ли она была остановлена:

@Override
public int onStartCommand(Intent intent,
    int flags, int startId) {

    //call startForeground first
    boolean stopService = false;
    if (intent != null) {
        stopService = intent.getBooleanExtra("request_stop", false);
    }
    if (stopService) {
        stopSelf();
        return START_STICKY;
    }
    //Continue with the background task
    return START_STICKY;
}

PS Если служба не была запущена, она сначала запускает службу, которая является накладными расходами.

3
задан JasonMArcher 4 August 2015 в 17:28
поделиться

4 ответа

Два способа сделать это:

Если ваша переменная AsyncFileUpload1 имеет квалификатор WithEvents, вы можете сделать следующее, используя ключевое слово Handles в самом обработчике событий:

Private Sub AsyncFileUpload1_UploadedComplete(ByVal sender As Object, ByVal e As AsyncFileUploadEventArgs) Handles AsyncFileUpdate1.UploadedComplete

    'handler logic...

End Sub

Если нет квалификатора WithEvents, то работает следующее:

AddHandler AsyncFileUpload1.UploadedComplete, AddressOf AsyncFileUpload1_UploadedComplete

Чтобы удалить обработчик событий, сделайте следующее:

RemoveHandler AsyncFileUpload1.UploadedComplete, AddressOf AsyncFileUpload1_UploadedComplete

Остерегайтесь WithEvents/Handles, так как это может привести к утечкам памяти . Это просто синтаксический сахар и проводов вверх по экрану AddHandler. Я добавляю это, потому что я был сожжен перед этим, изучая VB (у меня был фон C #).

0
ответ дан Community 21 August 2018 в 22:48
поделиться
  • 1
    AddHandler или C # += как уязвимы для утечек памяти как WithEvents. Это точно такая же проблема. Не причина для отказа WithEvents ИМХО. – MarkJ 13 January 2012 в 19:34
  • 2
    Правильно, я не сказал, что это не было безнаказанно. Я просто указал, что WithEvents по существу является AddHandler без RemoveHandler, поэтому он подвержен утечкам памяти так же, как AddHandler или +=. Я знаю, когда я код на C #, и у меня есть утечка памяти, я начинаю считать += и -= для событий. WithEvents может сделать эту проверку немного более сложной в VB. – avanek 13 January 2012 в 21:13

Здесь вы:

AddHandler AsyncFileUpload1.UploadedComplete, AddressOf AsyncFileUpload1_UploadedComplete

Кроме того, в вашем коде вы можете выбрать элемент AsyncFileUpload1 из выпадающего списка слева (чуть выше кода), а затем выбрать UploadComplete в правом выпадающем списке.

Это автоматически создаст обработчик событий с правильной сигнатурой, используя объявление VB Handles.

5
ответ дан competent_tech 21 August 2018 в 22:48
поделиться
  • 1
    Добро пожаловать. Помните, когда ответ на вопрос решает или помогает решить ваш вопрос, вы должны нажать на галочку рядом с ответом, чтобы будущие посетители вопроса знали, что это ответ, который решил ваш вопрос. Благодаря! – competent_tech 12 January 2012 в 21:29

Другие продемонстрировали, как буквально перевести event+= в AddHandler в VB.

Однако, несмотря на сходство, VB и C # - разные языки, а хороший код C # может быть не очень хорошим кодом VB при переводе буквально. Например, в VB канонический способ привязки фиксированного обработчика событий к элементу управления ASP.NET использует ключевое слово Handles:

Protected Sub AsyncFileUpload1_UploadedComplete(sender As Object, _
                                                e As AsyncFileUploadEventArgs) _
    Handles AsyncFileUpload1.UploadedComplete

    ' Your event handler code is here

End Sub
1
ответ дан Heinzi 21 August 2018 в 22:48
поделиться

Если вы можете поместить этот код в проект C #, который компилируется, вы можете преобразовать этот проект в VB.NET с помощью SharpDevelop . Это, вероятно, лучший способ перевести между C # и VB.NET.

Кроме того, ILSpy может переводить скомпилированную dll, написанную на C #, в VB.NET

0
ответ дан Justin Dearing 21 August 2018 в 22:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: