2010-04-14 32 views
10

Tôi đang cố gắng để tải về tập tin lớn từ Internet (> 20Mb)Android: tải tập tin lớn

private class DownloadTask extends AsyncTask<DatabaseInfo, Integer, String> { 

    private DatabaseInfo info; 

    protected String doInBackground(DatabaseInfo... dbInfo) { 

     int count; 
     info = dbInfo[0]; 

     try { 

      URL url = new URL(dbInfo[0].dbPath); 

      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream("/sdcard/db.zip"); 

      byte data[] = new byte[1024]; 
      int total = 0; 

      while ((count = input.read(data)) != -1) { 

       //output.write(data, 0, count); 

       total += count; 

       if (total % 10240 == 0) { 
        publishProgress(total); 
       } 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
     } 
     catch (Exception e) { 
      Log.e("err", e.getMessage()); 
     } 

     return null; 
    } 

    protected void onProgressUpdate(Integer... total) { 

     int perc = (int) ((float) total[0]/(float) info.dbZipSize * 100); 
     mProgressDialog.setProgress(perc); 
    } 

    protected void onPostExecute(String s) { 

     dismissDialog(DIALOG_PROGRESS); 
     Log.e("err", "finish!"); 
    } 
} 

Nếu tôi bỏ ghi chú dòng

//output.write(data, 0, count); 

sau 7-15% thoại tải progressbar sa thải và Tôi thấy "kết thúc!" trong Log. Tại sao?

+0

bạn đã thử trên thiết bị hoặc trình mô phỏng? nếu bạn đã thử nó trong trình giả lập thì nó không hoạt động đúng. vì bạn cần cấu hình hệ thống cao. – Praveen

+0

giả lập. ok, tôi sẽ thử trên thiết bị – embo

+0

có, trên thiết bị hoạt động tốt! – embo

Trả lời

5

Bạn nên xem xét triển khai các phạm vi HTTP. Điều này sẽ cho phép bạn khởi động lại quá trình tải xuống khi nó không thành công.

Vì lý do dừng lại, một số nhà cung cấp triển khai giới hạn tải xuống sẽ giảm kết nối sau một thời gian nhất định hoặc số lượng tải xuống. Tôi đã nhìn thấy bàn tay đầu tiên này trên một tàu sân bay Anh và được nói về nó trên những người khác. Nó thường dễ dàng để xác minh giới hạn bằng cách cố gắng tải xuống tệp thông qua trình duyệt Android và nếu bạn thấy nó dừng hoặc dừng bạn biết đó có thể là sự cố của nhà cung cấp dịch vụ (và có, việc tải xuống có thể bị chấm dứt mà không phải ném ngoại lệ).

Triển khai phạm vi Http sẽ cho phép bạn tiếp tục tải xuống từ nơi nó bị tắt và do đó phương pháp doInBackground của bạn sử dụng thuật toán giữ và tiếp tục để mỗi lần ngắt kết nối, bạn đợi một khoảng thời gian cố gắng tiếp tục nơi tải xuống đã tắt (và, tất nhiên, triển khai giới hạn thử lại để bạn không kết thúc bằng vòng lặp vô hạn khi điện thoại thực sự không thể tải xuống tệp).