2016-11-03 1 views
-2

(AsyncTask를 사용하여) URL에서 InputStream 요소로 파일을 가져 와서 사용하려고 시도했지만 실패했습니다. AsyncTask에 대한 매개 변수가 올바 릅니까? 내 코드 에서처럼 InputStream을 검사 할 수 있습니까? 아니면 잘못 되었습니까? 항상 null을 반환합니까? 다른 변경 사항이 있습니까?URL에서 AsyncTask의 InputStream

내 코드 :

String url = "https://www.example.com/file.txt"; 
InputStream stream = null; 

public void load() { 
    DownloadTask downloadTask = new DownloadTask(); 
    downloadTask.execute(url); 
    if (stream == null) { 
     //fail, stream == null 
    } else { 
     //success 
    } 
} 

class DownloadTask extends AsyncTask <String, Integer, InputStream> { 

@Override 
protected void onPreExecute() { 

} 

@Override 
protected InputStream doInBackground(String... params){ 

    try { 
     URL url = new URL(url); 
     stream = url.openStream(); 

    } catch (MalformedURLException e) { 
      e.printStackTrace(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return stream; 
} 

@Override 
protected void onPostExecute(InputStream result) { 
    super.onPostExecute(result); 
} 
} 

EDIT2 : 나는 그것을 해결했습니다.

답변

0

잘못된 방법으로 AsyncTask을 사용하고 있습니다. 작업을 다운로드 또는 서버 요청과 같은 doInBackground(String... params) 방법으로 수행하십시오.

매우 중요한 점은 onPostExecute(..) 방법으로 UI를 업데이트해야한다는 것입니다. 이 메소드는 UI-Thread에서 호출됩니다.

class DownloadTask extends AsyncTask <String, Integer, MyDownloadedData> { 

    private MyDownloadedData getFromStream(InputStream stream){ 
     // TODO 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected MyDownloadedData doInBackground(String... params){ 

     try { 
      URL url = new URL(url); 
      InputStream stream = url.openStream(); 

      MyDownloadedData data = getFromStream(stream); 
      return data; 
     } catch (Exception e) { 
      // do something 
     } 
     return stream; 
    } 

    @Override 
    protected void onPostExecute(MyDownloadedData data) { 
     // 
     // update your UI in this method. example: 
     // 
     someLabel.setText(data.getName()); 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     //... 
    } 


} 
+0

내가 (내 질문을 편집) 내 문제를 해결 : 여기

는 예 (의사 코드)입니다. onPostExecute() 메서드 내에서 UI를 업데이트해야하는 팁을 가져 주셔서 감사합니다! 의사 코드는 내 작업 (asynctask에서 inputstream 가져 오기) 때문에 preExecute, progressUpdate, getFromStream()이 필요하지 않기 때문에 나처럼 초보자에게 다소 혼란 스럽다.이 모든 것들은 작업과 관련이 없다. – user3671635