2017-04-06 112 views
2

我有2个简单的实现DownloadManager和自定义下载任务:下载管理器VS InputStream.read()

  • DownloadManager

    public void onCreate(Bundle savedInstanceState) { 
    ... 
    mDownloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
    } 
    
    private void startDownload(String link) 
    Uri uri=Uri.parse(link); 
    
    DownloadManager.Request req = new DownloadManager.Request(uri); 
    
    req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI 
         | DownloadManager.Request.NETWORK_MOBILE) 
         .setAllowedOverRoaming(false) 
         .setVisibleInDownloadsUi(false) 
         .setTitle(getString(R.string.app_name)) 
         .setDescription(getString(R.string.waiting_for_downloading)) 
         .setDestinationInExternalPublicDir(dataPath,fileName); 
    
    lastDownload = mDownloadManager.enqueue(req); 
    } 
    
    private void queryStatus() { 
    Cursor c = mDownloadManager.query(new DownloadManager.Query().setFilterById(lastDownload)); 
    
    if (c == null) return; 
    
    switch (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS))) { 
         case DownloadManager.STATUS_FAILED: 
          downloadError(); 
          break; 
         case DownloadManager.STATUS_RUNNING: 
          ... 
          break; 
         case DownloadManager.STATUS_SUCCESSFUL: 
          ... 
          break; 
         default: break; 
        } 
        c.close(); 
    } 
    
  • 自定义下载任务

    new AsyncTask<String, Void, Void>() { 
    @Override 
        protected Void doInBackground(String... params) { 
        try { 
         URL url = new URL(params[0]); 
         InputStream input = new BufferedInputStream(url.openStream()); 
         OutputStream output = new FileOutputStream(saveFile); 
         byte data[] = new byte[1024]; 
    
         while ((count = input.read(data)) != -1) { 
          output.write(data, 0, count); 
         } 
         output.flush(); 
         output.close(); 
         input.close(); 
    
        } catch (Exception e) { 
         downloadError(); 
         } 
        return null; 
        } 
    } 
    

i n一般情况下,这两种方法都可以,但是在某些设备上(适用于xiaomi android 6)DownloadManager工作速度慢了2-3倍,或者我得到了DownloadManager.STATUS_FAILED错误。但为什么?是DownloadManager不稳定?或者它对设置有害?

p.s:我想使用DownloadManager由于定制,我不应该自己执行像设置允许的网络或在通知区域显示进度。

更新V0.1

1)我有处理程序,称为queryStatus()检查每1秒一次。

2)试图连接到另一个wi-fi网络与Nexus手机 - DownloadManager工作正常,但自定义实现失败...

更新V0.2

试图从Service调用AsyncTask下载(如果用户在不取消处理的情况下关闭应用程序,则继续下载),通过BroadcastReceiver更新UI更新+ sendBreadcase()来自Service的调用 - 结果:下载速度变慢几倍现在(不时)我得到了一个unexpected end of stream例外。 [尝试我已经下载了相同的文件从Activity进行呼叫时]

更新V0.3

忘了注意:DownloadManager失败,1008原因= ERROR_CANNOT_RESUME

试图ION也。看起来,如果要作比DownloadManager更好但有些时候得到了一个错误End of data reached before content length was read: 70385664/77217546

如此,还在寻找最稳定的解决方案......

回答

0

OK了...有很多的不同的Wi-Fi连接,通过测试和一套设备。 ION授予最稳定的结果。