2013-01-13 2 views
8

Ho cercato di scaricare video da un URL, ho implementato il mio metodo di download nel doInBackground() di asynctask, ma il metodo doInBackground richiede molto tempo per viene chiamato (5-10 minuti), sto usando un altro asyntask per scaricare l'immagine nell'attività da cui sono diretto per scaricare l'attività video e il suo funzionamento. Il mio metodo onPreExecute viene richiamato in tempo, ma in seguito doInBackground impiega circa 5-7 minuti per iniziare. Sarò davvero grato per qualsiasi aiuto fornito. Ecco mycodeAndroid: il metodo doInBackground di Asynctask viene chiamato dopo un lungo ritardo

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

Potrebbe pubblicare il tuo codice? doInBackground viene chiamato non appena onPreExecute è terminato (ed esiste), quindi deve esserci qualcosa di sbagliato nel modo in cui lo chiami o nel tuo onPreExecute. –

+0

probabilmente sta usando post delayed, la sua esecuzione impossibile dopo 10 minuti – deadfish

+0

@ D_Steve595 Il mio metodo onPreExecute viene chiamato in tempo, che ho scoperto durante il debug, ma dopo che doInBackground richiede quasi 5-7 minuti per iniziare. –

risposta

12

Assicurarsi che nessun altro asyncTasks sono in esecuzione, annullando se necessario.

sulla maggior parte delle versioni di Android, asyncTask viene eseguito su un singolo thread in background e dovrebbe eseguire solo piccole attività.

nel caso in cui l'attività potrebbe richiedere troppo tempo (o ci sono più attività), prendere in considerazione la possibilità di annullarle o utilizzare un approccio alternativo (come l'utilizzo di executeOnExecutor come descritto on the API).

+1

yup ha utilizzato lo stesso executeOnExecutor.Thanks –

+0

nota che l'utilizzo di executeOnExecutor ti dà ancora molte responsabilità, quindi non creare troppe attività (hanno un limite di quante attività devono avere alla volta). più i thread ci sono, più lentamente diventerà l'app. –

0

Sono di fronte allo stesso problema nonostante non si sia mai verificato ogni volta.

è possibile utilizzare il filo tradtional di un'alternativa e di gestire l'interfaccia utente cambia te stesso