2013-03-04 4 views
1
URL url = new URL(myurl); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.setReadTimeout(10000 /* milliseconds */); 
      conn.setConnectTimeout(15000 /* milliseconds */); 
      conn.setRequestMethod("GET"); 
      conn.setDoInput(true); 
      // Starts the query 
      conn.connect(); 
      int response = conn.getResponseCode(); 
      Log.d("1", "The response is: " + response); 


      in = new BufferedInputStream(conn.getInputStream()); 

      out = new FileOutputStream(file); 

      int bufferLength = 0; 
      byte[] buffer = new byte[1024]; 

      while ((bufferLength = in.read(buffer)) > 0) { 
       out.write(buffer, 0, bufferLength); 
      } 

작은 xml 파일을 다운로드 한 다음이 파일에서 개체를 만들고 구문 분석합니다.파일 다운로드에 많은 시간이 걸립니다.

파일 크기 3,8 kB 그러나 다운로드 시작 후 몇 가지 데이터를 표시하는 데 몇 초가 걸립니다. 인터넷 연결없이 이미 다운로드 한 파일을 구문 분석 할 때 데이터를 표시하는 데 1 초도 걸리지 않습니다. 그 결론은이 방법에 문제가 있다고 결론 내렸다. 추신 : 그 후 작은 미리보기 이미지를 다운로드 중입니다.

나는 인터넷 연결이

@Override 
protected ArrayList<?> parseData(File dataFile) { 
    // TODO Auto-generated method stub 
    long startTime = System.currentTimeMillis(); 




    ArrayList<Training> list = new ArrayList<Training>(); 
    MyParser parser = new MyParser(); 
    MyFileDownloader downloader = new MyFileDownloader(); 
    try { 
     list = parser.parseTrainings(dataFile); 
     boolean networkAvaible = fragment.isNetworkAvailable(); 
     for (int i = 0; i < list.size(); i++) { 
      if (networkAvaible) 
       downloader.downloadFile(list.get(i).getImageURL(), new File(fragment.getDataFolder(), "image"+i)); 
      String path = fragment.getDataFolder().getPath() + "/image"+i; 
      Drawable im = Drawable.createFromPath(path); 
      list.get(i).setImage(im); 
     } 

    } catch (XPathExpressionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (XmlPullParserException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ParserConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SAXException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    long stopTime = System.currentTimeMillis(); 
    long elapsedTime = stopTime - startTime; 
    Log.d("******TIME PASSED******", String.valueOf(elapsedTime)); 
    return list; 

시간

을 측정했고 나는 약 9-11 초를 복용 파일을 다운로드해야합니다. 다운로드 할 필요가 없을 때 약 0.5 초가 소요됩니다. 이 파일을 다운로드하는 시간을 어떻게 줄일 수 있습니까? 파일 크기의 합계는 5236 Mbits입니다. 내 20Mbps Wi-Fi로 1 초 이내에 다운로드해야합니다. 1-2 초 정도면 괜찮을 것입니다. 하지만 9 초 또는 16 초가 걸렸습니까? 그것은 나쁜 사용자 경험입니다.

+0

제거 (= 새로운 BufferedInputStream을의가)의 InputStream를 사용합니다. 귀하의 코드는 괜찮아 보입니다. 네트워크 속도에 문제가있을 수 있습니다. – kumar

+0

아니요, Wi-Fi에서 약 20Mbps입니다. 버퍼 된 입력을 사용하지 않는 이유는 무엇입니까? 속도가 느리지 않아야합니까? – user1685095

+0

다른 AsyncTask를 사용하여 ListAdapter의 getView() 메소드에서 필요한 파일을 다운로드하는 것을 고려했습니다. 사용자에게 ListFragment를 사용하여 데이터를 나타냅니다. 그러나 목록이 실제로 작기 때문에 (5 ~ 10 요소)이 솔루션을 원하지 않습니다. – user1685095

답변

0

파일을 다운로드 할 때 asynctask를 사용하십시오. 좋은 예가 있습니다.

http://www.androidhive.info/2012/04/android-downloading-file-by-showing-progress-bar/

+0

이미 사용 중입니다. 이 메서드는 AsyncTask 내에서 호출됩니다. 질문 질문은 왜 파일을 다운로드하는 데 많은 시간이 걸리는 것입니까? 이걸 더 빨리 할 수 ​​있을까요? 그것이 서버를 느리게 할 수 있습니까? 지금 파일은 드롭 박스에 있습니다. 아마도 시스템 시간을 확보하여 다운로드 시간을 측정 할 수 있습니다. 아마도 유용한 정보를 줄 것입니다. 어떻게 생각하십니까? – user1685095

관련 문제