0

Ich hatte Download-Task mit Intent-Service erstellt. das zeigt Benachrichtigung mit Fortschrittsbalken mit Prozent. Ich verwende lokalen Broadcast-Manager, um Daten während des Downloads zu übergeben.Ich füge auch eine Schaltfläche, um den Download in der Benachrichtigung abzubrechen, aber das Problem ist, während ich auf Abbrechen klicken Download es nicht Stop Intent-Service. Wie kann ich den beabsichtigten Service stoppen? Hier stelle ich meinen Code of Intent Service und auch den Broadcast Receiver in den Dienst.Intent-Service nicht explizit gestoppt

public class DownloadService extends IntentService { 
    public DownloadService() { 
     super(DownloadService.class.getName()); 
    } 

    @Override 
    protected void onHandleIntent(@Nullable Intent intent) { 
     InputStream input; 
     OutputStream output; 
     HttpURLConnection connection; 
     Intent intent1 = new Intent(); 
     intent1.setAction("com.demo.downloading"); 
     try { 
      URL url = new URL(urlToDownload); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { 
       return; 
      } 

      final int fileLength = connection.getContentLength(); 
      input = connection.getInputStream(); 
      output = new FileOutputStream(file); 

      byte data[] = new byte[8192]; 
      long total = 0; 
      int count, latestPercentDone; 
      int percentDone = -1; 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       latestPercentDone = (int) (total * 100/fileLength); 
       if (percentDone != latestPercentDone) { 
        percentDone = latestPercentDone; 
        if (percentDone < 100) { 
         if (percentDone != 0) { 
          intent1.putExtra("progress", "" + percentDone); 
          intent1.putExtra("IsCancel", false); 
          LocalBroadcastManager.getInstance(this).sendBroadcast(intent1); 
         } 
        } 
        if (percentDone == 100) { 
         intent1.putExtra("progress", "" + 0); 
         intent1.putExtra("IsCancel", false); 
         LocalBroadcastManager.getInstance(this).sendBroadcast(intent1); 
        } 
       } 
       output.write(data, 0, count); 
       if (StaticFields.cancelDownload) { 
        Log.d(TAG, "onHandleIntent: Download Cancel"); 
        this.stopSelf(); 
       } 
      } 
      output.close(); 
     } catch (IOException e) { 
      intent1.putExtra("progress", "" + (-1)); 
      intent1.putExtra("IsCancel", true); 
      LocalBroadcastManager.getInstance(this).sendBroadcast(intent1); 
      e.printStackTrace(); 
      is_all_download = false; 
     } 
    } 
} 

Meine Rundfunkempfänger Klasse OnReceive Methode()

if (intent.getAction() != null) { 
      if (action.equals("notification_cancelled")) { 
        Global.cancelDownload = true; 
        Intent intent1 = new Intent(); 
        intent1.setAction("com.demo.downloading"); 
        intent1.putExtra("IsCancel", true); 
        LocalBroadcastManager.getInstance(context).sendBroadcast(intent1); 
       } 
      } 
     } 

LocalBroadcast Manager

boolean isCancel = intent.getBooleanExtra("IsCancel", false); 
      if (isCancel) { 
       Global.cancelDownload = true; 
       mContext.stopService(serviceIntent); 
} 
+0

eigentlich habe ich keine Ahnung auf Download-Manager und auch ich möchte den Fortschritt in der Benachrichtigung mit Abbrechen Download-Button so ... –

Antwort

1

In einem IntentService Verfahren erhalten wird onHandleIntent() auf einem Arbeiter (Hintergrund) Thread aufgerufen. Wenn Sie stopService() aufrufen, hat das keine Auswirkung auf die Worker-Threads, da sie weiterhin ausgeführt werden. Ein Aufruf von stopService() auf einem IntentService macht sowieso keinen Sinn, da ein IntentService läuft, wenn es Arbeit zu tun hat und sich selbst stoppt, wenn alle Arbeit beendet ist.

Anstatt stopService() aufzurufen, müssen Sie ein Flag in Ihrem Service setzen, das in der Schleife in Ihrer onHandleIntent() Methode überprüft werden kann. Wenn das Flag gesetzt ist, sollten Sie die weitere Verarbeitung in Ihrer Schleife abbrechen und den Worker-Thread selbst beenden.

+0

Vielen Dank für Ihre Antwort, aber das Problem ist, wenn ich einchecke Schleife macht App einfrieren weiß nicht, welches Problem auftritt. –

+0

und was ist für mehrere Downloads? –

+0

Ich verstehe Ihre Kommentare nicht. Bitte posten Sie einen Code und geben Sie an, um welches Problem es sich handelt. –