2013-01-13 8 views
8

Próbowałem pobierać filmy z adresu URL, zaimplementowałem moją metodę pobierania w funkcji asynctask doInBackground(), ale metoda doInBackground zajmuje dużo czasu nazywam się (5-10 minut), używam innego asyntask do pobrania obrazu w działaniu, z którego jestem skierowany, aby pobrać aktywność wideo i działa poprawnie. Moja metoda onPreExecute jest wywoływana na czas, ale po tym doInBackground zajmuje prawie 5-7 minut, aby rozpocząć. Będę naprawdę wdzięczny za każdą udzieloną pomoc. Oto mycodeAndroid: Metoda doInBackground Asynctask jest wywoływana po długim opóźnieniu

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

Czy możesz napisać swój kod? doInBackground jest wywoływane, gdy tylko onPreExecute jest zakończony (i istnieje), więc musi coś być nie tak z tym, jak go wywołujesz lub w swoim onPreExecute. –

+0

prawdopodobnie używa on opóźnienia, jego niemożliwe uruchomienie po 10 minutach – deadfish

+0

@ D_Steve595 Moja metoda onPreExecute jest wywoływana na czas, który dowiedziałem się podczas debugowania, ale po tym doInBackground trwa prawie 5-7 minut, aby rozpocząć. –

Odpowiedz

12

upewnić żadne inne asyncTasks są uruchomione, anulując je w razie potrzeby.

w większości wersji Androida, asyncTask działa na pojedynczym wątku tła i powinien wykonywać tylko małe zadania.

w przypadku, gdy zadanie może zająć zbyt dużo czasu (lub jest wiele zadań), należy rozważyć anulowanie lub zastosować alternatywne podejście (np. Używając executeOnExecutor zgodnie z opisem on the API).

+1

Tak samo użyłem executeOnExecutor.Thanks –

+0

zwróć uwagę, że używanie executeOnExecutor nadal wiąże się z dużą odpowiedzialnością, więc nie twórz zbyt wielu zadań (mają one limit liczby zadań jednocześnie). plus im więcej wątków, tym wolniej stanie się aplikacja. –

0

Mam do czynienia z tym samym problemem, mimo że nie zdarzyło się za każdym razem.

Możesz użyć Tradtional Thread jako alternatywy i samodzielnie zarządzać zmianami interfejsu użytkownika

Powiązane problemy