2012-06-14 2 views
1

Я хочу загрузить видео из Интернета в своем приложении. Следовательно, я начал новый поток, и в этом потоке я начал службу, которая загружает файл. Однако он запускает приложение, не отвечающее на диалог, на эмулятор, но загружает файл в фоновом режиме. Я много искал, но не нашел решения. Пожалуйста помоги!Приложение не отвечает в дочерней цепочке

Моя нить, как показано ниже:

Thread t = new Thread() 
    { 
     public void run() 
     { 
      Log.i("Test Log", "Starting Service"); 
      Intent intent = new Intent(MainActivity.this, DownloadService.class); 
      startService(intent); 
     } 
    }; 
    t.start(); 

и фрагмент кода сервиса ниже:

try 
    { 
     Log.i("Test log", "Entered function"); 

     String RootDir = Environment.getExternalStorageDirectory() + File.separator + "Video"; 
     File RootFile = new File(RootDir); 
     RootFile.mkdir(); 

     URL u = new URL(fileURL); 
     HttpURLConnection c = (HttpURLConnection) u.openConnection(); 
     c.setRequestMethod("GET"); 
     c.setDoOutput(true); 
     c.connect(); 

     long fileSize = c.getContentLength(); 
     Log.e("Test log", "File Size is: " +String.valueOf(fileSize)); 

     String downloadedFile = RootFile + "/Sample.mp4"; 
     Log.i("Test Log", downloadedFile); 
     File df = new File(downloadedFile); 

     if(fileSize == df.length()) 
     { 
      Log.i("Test log", "File exists already! Did not download"); 
      stopSelf(); 
     } 
     else 
     { 
      FileOutputStream f = new FileOutputStream(new File(RootFile, fileName)); 
      InputStream in = c.getInputStream(); 
      byte[] buffer = new byte[1024]; 

      int len1 = 0; 
      while ((len1 = in.read(buffer)) > 0) 
      { 
       f.write(buffer, 0, len1); 
      } 
      f.close(); 

      Log.i("Test log", "Downloaded and file saved as "+downloadedFile); 
      stopSelf(); 
     } 
    } 
    catch (Exception e) 
    { 
     Log.e("Catch exception", "Error is " +e.toString()); 
    } 
} 

EDIT: Внизу журнала аварии:

06-14 17:32:32.638: E/ActivityManager(60): ANR in com.pranav.download 
    06-14 17:32:32.638: E/ActivityManager(60): Reason: Executing service com.pranav.download/.DownloadService 
    06-14 17:32:32.638: E/ActivityManager(60): Load: 0.49/0.21/0.17 
    06-14 17:32:32.638: E/ActivityManager(60): CPU usage from 723800ms to 49ms ago: 
    06-14 17:32:32.638: E/ActivityManager(60): system_server: 5% = 4% user + 1% kernel/ faults: 3616 minor 2 major 
    06-14 17:32:32.638: E/ActivityManager(60): adbd: 1% = 0% user + 1% kernel/faults: 1593 minor 
    06-14 17:32:32.638: E/ActivityManager(60): qemud: 0% = 0% user + 0% kernel 
    06-14 17:32:32.638: E/ActivityManager(60): m.android.phone: 0% = 0% user + 0% kernel/faults: 18 minor 
    06-14 17:32:32.638: E/ActivityManager(60): ndroid.launcher: 0% = 0% user + 0% kernel/faults: 869 minor 
    06-14 17:32:32.638: E/ActivityManager(60): d.process.acore: 0% = 0% user + 0% kernel/faults: 1143 minor 
    06-14 17:32:32.638: E/ActivityManager(60): id.defcontainer: 0% = 0% user + 0% kernel/faults: 64 minor 
    06-14 17:32:32.638: E/ActivityManager(60): events/0: 0% = 0% user + 0% kernel 
    06-14 17:32:32.638: E/ActivityManager(60): com.svox.pico: 0% = 0% user + 0% kernel/faults: 28 minor 
    06-14 17:32:32.638: E/ActivityManager(60): rild: 0% = 0% user + 0% kernel 
    06-14 17:32:32.638: E/ActivityManager(60): logcat: 0% = 0% user + 0% kernel 
    06-14 17:32:32.638: E/ActivityManager(60): ndroid.settings: 0% = 0% user + 0% kernel/faults: 8 minor 
    06-14 17:32:32.638: E/ActivityManager(60): d.process.media: 0% = 0% user + 0% kernel/faults: 9 minor 
    06-14 17:32:32.638: E/ActivityManager(60): roid.alarmclock: 0% = 0% user + 0% kernel/faults: 7 minor 
    06-14 17:32:32.638: E/ActivityManager(60): com.android.mms: 0% = 0% user + 0% kernel/faults: 9 minor 
    06-14 17:32:32.638: E/ActivityManager(60): m.android.email: 0% = 0% user + 0% kernel/faults: 8 minor 
    06-14 17:32:32.638: E/ActivityManager(60): netd: 0% = 0% user + 0% kernel/faults: 4 minor 
    06-14 17:32:32.638: E/ActivityManager(60): ronsoft.openwnn: 0% = 0% user + 0% kernel/faults: 7 minor 
    06-14 17:32:32.638: E/ActivityManager(60): .quicksearchbox: 0% = 0% user + 0% kernel/faults: 8 minor 
    06-14 17:32:32.638: E/ActivityManager(60): android.protips: 0% = 0% user + 0% kernel/faults: 7 minor 
    06-14 17:32:32.638: E/ActivityManager(60): ackageinstaller: 0% = 0% user + 0% kernel/faults: 16 minor 
    06-14 17:32:32.638: E/ActivityManager(60): zygote: 0% = 0% user + 0% kernel/faults: 35 minor 
    06-14 17:32:32.638: E/ActivityManager(60): installd: 0% = 0% user + 0% kernel/faults: 3 minor 
    06-14 17:32:32.638: E/ActivityManager(60): m.android.music: 0% = 0% user + 0% kernel/faults: 7 minor 
    06-14 17:32:32.638: E/ActivityManager(60): +pranav.download: 0% = 0% user + 0% kernel 
    06-14 17:32:32.638: E/ActivityManager(60): +pranav.download: 0% = 0% user + 0% kernel 
    06-14 17:32:32.638: E/ActivityManager(60): TOTAL: 14% = 6% user + 7% kernel + 0% irq + 0% softirq 
+0

Вы используете «IntentService»? – Luksprog

+0

Покажите нам журналы аварийных ситуаций –

+0

@Luksprog Я на данный момент пользуюсь Сервисом. Пробовал IntentService тоже. Та же ошибка. – Pranav

ответ

0

Использование async task handler ... так что основной поток не будет прерван и загрузка будет выполнена в фоновом режиме ... Если вам нужна example..please, дайте мне знать ..
использовать эту ссылку Async tasks

+0

Я хотел, чтобы служба загрузки убила себя после операции. Именно по этой причине я использовал stopSelf и пробовал IntentService и не использовал AsyncTask. Возможно ли это в AsyncTask? или есть способ убить AsyncTask после завершения операции? Я убиваю его, потому что я буду называть одну и ту же службу несколько раз в приложении и не хочу поднимать ошибку, не создавая загрузку, потому что служба уже запущена. – Pranav

0

Вы, возможно, начал службу из другого потока, но он будет работать код в потоке пользовательского интерфейса.

В вашей службе введите код для загрузки видео в doInBackground(...) метод AsyncTask, например.

new AsyncTask< Void, Void, Void >() { 
    @Override 
    protected Void doInBackground(final Void... params) 
    { 
     // Your download code 
    } 
} 
+0

Я не был уверен, будет ли поток снова запущен, если он уже запущен, и, следовательно, я хочу убить поток, который загружает coz. Я хочу называть его несколько раз в приложении. Следовательно, я использовал stopSelf в потоке и использовал IntentService. Запускает ли еще одно действие AsyncTask, даже если предыдущий вызов работает в фоновом режиме? Или, есть способ убить его, чтобы он не создавал проблем позже? – Pranav