2014-10-06 20 views
6

Ecco il mio problema. Sto provando a scaricare il file dal mio server usando l'intento di download manager tramite Asynctask. nel mio doInBackground della classe asynctask, mi è stato richiamato l'intento di download manager e doinBackground restituirà il valore booleano al termine del download (riuscito o non riuscito). Ecco il mio codiceCome ricevere lo stato dell'intestazione del download manager fino al download riuscito o non riuscito

protected Boolean doInBackground(String... f_url) { 
       boolean flag = true; 
       boolean downloading =true; 
       try{ 
        DownloadManager mManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);    
            Request mRqRequest = new Request(
              Uri.parse("http://"+model.getDownloadURL())); 
            long idDownLoad=mManager.enqueue(mRqRequest); 
            DownloadManager.Query query = null; 
            query = new DownloadManager.Query(); 
            Cursor c = null; 
            if(query!=null) { 
               query.setFilterByStatus(DownloadManager.STATUS_FAILED|DownloadManager.STATUS_PAUSED|DownloadManager.STATUS_SUCCESSFUL| 
                 DownloadManager.STATUS_RUNNING|DownloadManager.STATUS_PENDING);           
            } else { 
           return flag; 
            } 
            c = mManager.query(query); 
             if(c.moveToFirst()) { 
        int status =c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); 


             while (downloading) 
             { Log.i ("FLAG","Downloading"); 
              if (status==DownloadManager.STATUS_SUCCESSFUL) 
              { Log.i ("FLAG","done"); 
               downloading = false; 
               flag=true; 
               break;  
              } 
              if (status==DownloadManager.STATUS_FAILED) 
              {Log.i ("FLAG","Fail"); 
               downloading = false; 
               flag=false; 
               break; 
              } 
           c.moveToFirst(); 
             } 
       } 
            return flag; 
       } 
       catch (Exception e) 
       { 
        flag = false; 
         return flag; 
       }  
      } 

Ma lo stato DownloadManager mai saltare sul DownloadManager.STATUS_SUCCESSFUL o DownloadManager.STATUS_FAILED. Qualche aiuto per me?

risposta

4

È necessario richiedere il download manager. Il cursore rimane lo stesso anche se i dati cambiano. Prova in questo modo:

protected Boolean doInBackground(String... f_url) { 
    boolean flag = true; 
    boolean downloading =true; 
    try{ 
     DownloadManager mManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);    
     Request mRqRequest = new Request(
     Uri.parse("http://"+model.getDownloadURL())); 
     long idDownLoad=mManager.enqueue(mRqRequest); 
     DownloadManager.Query query = null; 
     query = new DownloadManager.Query(); 
     Cursor c = null; 
     if(query!=null) { 
      query.setFilterByStatus(DownloadManager.STATUS_FAILED|DownloadManager.STATUS_PAUSED|DownloadManager.STATUS_SUCCESSFUL|DownloadManager.STATUS_RUNNING|DownloadManager.STATUS_PENDING);           
     } else { 
      return flag; 
     } 

     while (downloading) { 
      c = mManager.query(query); 
      if(c.moveToFirst()) { 
       Log.i ("FLAG","Downloading"); 
       int status =c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); 

       if (status==DownloadManager.STATUS_SUCCESSFUL) { 
        Log.i ("FLAG","done"); 
        downloading = false; 
        flag=true; 
        break;  
       } 
       if (status==DownloadManager.STATUS_FAILED) { 
        Log.i ("FLAG","Fail"); 
        downloading = false; 
        flag=false; 
        break; 
       } 
      } 
     } 

     return flag; 
    }catch (Exception e) { 
     flag = false; 
     return flag; 
    }  
} 
0

scaricare file Download Manager in modo asincrono. Quindi non c'è bisogno di mettere il gestore dei download all'interno di un Asyntask.

È possibile utilizzare il ricevitore per ottenere lo stato di download manager se il download è completo.

public class CheckDownloadComplete extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 

     String action = intent.getAction(); 
      if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) 
      { 
       DownloadManager.Query query = new DownloadManager.Query(); 
       query.setFilterById(intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0)); 
       DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); 
       Cursor cursor = manager.query(query); 
       if (cursor.moveToFirst()) { 
        if (cursor.getCount() > 0) { 

         int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); 
         Long download_id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,0); 

         // status contain Download Status 
         // download_id contain current download reference id 

         if (status == DownloadManager.STATUS_SUCCESSFUL) 
         { 
          String file = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME)); 

          //file contains downloaded file name 

          // do your stuff here on download success 

         } 
        } 
       } 
       cursor.close(); 
      } 
    } 
} 

Non dimenticate di aggiungere il ricevitore in manifesto

<receiver 
     android:name=".CheckDownloadComplete" 
     android:enabled="true" 
     android:exported="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
     </intent-filter> 
    </receiver> 
Problemi correlati