2013-01-13 17 views
8

Ich habe versucht, Videos von einer URL herunterladen, habe ich meine Download-Methode in der DoInBackground() von asynctask implementiert, aber die DoInBackground-Methode nimmt eine Menge Zeit in Anspruch Rufen Sie an (5-10 Minuten), ich benutze eine andere Asyntask, um ein Bild in der Aktivität herunterzuladen, von der ich angewiesen wurde, die Videoaktivität herunterzuladen und es funktioniert gut. Meine onPreExecute Methode wird pünktlich aufgerufen, aber danach braucht doInBackground fast 5-7 Minuten um zu starten. Ich werde wirklich für jede Hilfe dankbar sein. Hier ist mycodeAndroid: Asynctask DoInBackground Methode wird nach einer langen Verzögerung

btnDownloadLQ.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) 
      { 
       try 
       { 
        new DownloadVideoTask().execute(videoURL); 

       } 
       catch(Exception e) 
       { 
        Log.e("Vidit_TAG","I got an error",e); 
       } 
      } 
     }); 

private class DownloadVideoTask extends AsyncTask<String, String, String> 
    { 

     @SuppressWarnings("deprecation") 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      showDialog(DIALOG_DOWNLOAD_PROGRESS); 
     } 

     protected String doInBackground(String... urls) 
     { 
      int i=0; 
      try 
      { 
       URL url = new URL (urls[0]); 
       InputStream input = url.openStream(); 

       try { 
        //The sdcard directory e.g. '/sdcard' can be used directly, or 
        //more safely abstracted with getExternalStorageDirectory() 
        String root = Environment.getExternalStorageDirectory().toString(); 
        File storagePath = new File(root + "/vidit");  
        storagePath.mkdirs(); 
        OutputStream output = new FileOutputStream (new File(storagePath,title+".mp4")); 
        try 
        { 
         byte[] buffer = new byte[1024]; 
         int bytesRead = 0; 
         while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) 
         { 
          output.write(buffer, 0, bytesRead); 
         } 
        } 
        catch(Exception e) 
        { 
         Log.e("Vidit_TAG","I got an error",e); 
        } 
        finally 
        { 
         output.close(); 
        } 
       } 
       catch(Exception e) 
       { 
        Log.e("Vidit_TAG","I got an error",e); 
       } 
       finally 
       { 
        input.close(); 
        //tvTitle.setText("Completed"); 
       } 

      } 
      catch(Exception e) 
      { 
       Log.e("Vidit_TAG","I got an error",e); 
      } 

      return null; 
     } 


     @SuppressWarnings("deprecation") 
     @Override 
     protected void onPostExecute(String unused) 
     { 
      dismissDialog(DIALOG_DOWNLOAD_PROGRESS); 
      alertbox(title); 
     } 
    } 
+1

Konnten Sie Ihren Code veröffentlichen? doInBackground wird aufgerufen, sobald onPreExecute beendet ist (und es existiert), also muss etwas falsch sein, wie Sie es aufrufen oder in Ihrem onPreExecute. –

+0

wahrscheinlich ist er post-verzögert, es ist unmöglich, nach 10 Minuten – deadfish

+0

@ D_Steve595 My OnPreExecute Methode aufgerufen wird rechtzeitig, die ich während des Debuggens, aber danach DoInBackground dauert fast 5-7 Minuten zu starten. –

Antwort

12

sicher, keine anderen asyncTasks laufen, indem man sie annullieren, wenn nötig.

In den meisten Android-Versionen läuft asyncTask auf einem einzelnen Hintergrund-Thread und sollte nur kleine Aufgaben ausführen.

Falls die Aufgabe zu lange dauert (oder mehrere Aufgaben haben), sollten Sie sie abbrechen oder einen alternativen Ansatz verwenden (z. B. mit executeOnExecutor wie beschrieben on the API).

+1

yup tat das gleiche used executeOnExecutor.Thanks –

+0

Beachten Sie, dass die Verwendung von executeOnExecutor gibt Ihnen immer noch eine Menge Verantwortung, so erstellen Sie nicht zu viele Aufgaben (sie haben eine Grenze, wie viele Aufgaben zu einer Zeit haben). Je mehr Threads vorhanden sind, desto langsamer wird die App. –

0

Ich bin mit dem gleichen Problem konfrontiert, obwohl es nicht jedes Mal passiert ist.

Sie könnten den traditionellen Thread für eine Alternative verwenden und die Benutzeroberfläche selbst ändern

Verwandte Themen