2016-10-08 2 views
0

AsyncTask를 사용하여 파일을 다운로드하고 있습니다. 그러나 파일을 다운로드하는 동안 UI가 고정되고 뭔가를 수행 할 수 있도록 파일 다운로드가 완료 될 때까지 기다려야합니다. 다른 스레드를 찾았지만 .get()을 사용하여 작업을 실행하는 것과 같은 문제 만 발견했습니다. 는 여기에 내가Assync 작업 고정 UI

new DownloadFileFromUrl().execute("url"); 

여기에 내가이 끝난 때 모니터에 Done!을 보내도록했습니다

class DownloadFileFromURL extends AsyncTask<String, Integer, LineData> { 

    String fileDir = getApplicationContext().getFilesDir() + "/data.txt"; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected LineData doInBackground(String... f_url) { 
     int count; 
     //Download file-------------------------- 
     try { 
      URL url = new URL(f_url[0]); 
      URLConnection conection = url.openConnection(); 
      conection.connect(); 
      int lenghtOfFile = conection.getContentLength(); 
      InputStream input = new BufferedInputStream(url.openStream(), 
        8192); 
      OutputStream output = new FileOutputStream(fileDir); 
      byte data[] = new byte[1024]; 
      long total = 0; 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       publishProgress((int) total * 100/lenghtOfFile); 
       output.write(data, 0, count); 
      } 
      output.flush(); 
      output.close(); 
      input.close(); 
     } catch (Exception e) { 
      Log.e("Error: ", e.getMessage()); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(LineData data) { 
     setDataFor24Hours(); 
     setDataFor48Hours(); 
     setDataFor72Hours(); 
     showDataFor24Hours(); 
     setList(); 
     Log.e("Downloader: ", "done!"); 
    } 

} 

AsyncTask를을 년대 AsyncTask를 호출하고있어 방법은,이 순간에 UI는 고정 해제 얻는다 또한 문제는 AsyncTask에 있습니다. 누구든지 나를 도울 수 있기를 바랍니다. 미리 감사드립니다!

+0

* UI가 고정되어 있지 않습니까? 즉, 사용자 클릭이 발생하지 않았습니까? – kujeensiti

+0

장기 실행 작업은 호스팅 활동 또는 단편에 대한 의존성과 같은 여러 가지 이유로 실제로 AsyncTask를 사용하지 않아야합니다. 백그라운드에서 실행되고 활동이나 프래그먼트와 독립적으로 실행되는 서비스를 시도해야합니다. – Eenvincible

+0

결과 유형이'LineData'로 정의되었지만'doInBackground()'에서'null '을 리턴하는 이유는 무엇입니까? –

답변

1

AsyncTask는 UI를 고정하지 않고 작업을 수행 할 수 있도록 디자인되었습니다. 그러나 doInBackground은 백그라운드에서 실행됩니다. 하지만 onPostExecute UI 스레드에서 실행됩니다. 어쩌면 문제가 onPostExecute에 있습니다.

+0

'Done! '을 다운로드 기능의 끝으로 옮겼습니다. 당신 말이 맞아요. 문제는'onPostExecute()'에 있습니다. 감사 –

0

이와 같이 정의하십시오.

+0

죄송합니다. 오류입니다. 나는 여기에 잘못 입력했다. 어쨌든 고마워. –