Даже после вызова 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 Если служба не была запущена, она сначала запускает службу, которая является накладными расходами.
Два способа сделать это:
Если ваша переменная 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 #).
Здесь вы:
AddHandler AsyncFileUpload1.UploadedComplete, AddressOf AsyncFileUpload1_UploadedComplete
Кроме того, в вашем коде вы можете выбрать элемент AsyncFileUpload1
из выпадающего списка слева (чуть выше кода), а затем выбрать UploadComplete
в правом выпадающем списке.
Это автоматически создаст обработчик событий с правильной сигнатурой, используя объявление VB Handles
.
Другие продемонстрировали, как буквально перевести 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
Если вы можете поместить этот код в проект C #, который компилируется, вы можете преобразовать этот проект в VB.NET с помощью SharpDevelop . Это, вероятно, лучший способ перевести между C # и VB.NET.
Кроме того, ILSpy может переводить скомпилированную dll, написанную на C #, в VB.NET
AddHandler
или C #+=
как уязвимы для утечек памяти какWithEvents
. Это точно такая же проблема. Не причина для отказаWithEvents
ИМХО. – MarkJ 13 January 2012 в 19:34WithEvents
по существу являетсяAddHandler
безRemoveHandler
, поэтому он подвержен утечкам памяти так же, какAddHandler
или+=
. Я знаю, когда я код на C #, и у меня есть утечка памяти, я начинаю считать+=
и-=
для событий.WithEvents
может сделать эту проверку немного более сложной в VB. – avanek 13 January 2012 в 21:13