2014-10-06 12 views
6

Oto mój problem. Próbuję pobrać plik z mojego serwera, używając intencji menedżera pobierania przez Asynctask. w moim doInBackground z klasy asynctask, został wywołany zamiar menedżera pobierania, a doinBackground zwróci wartość boolean po zakończeniu pobierania (powodzenie lub niepowodzenie). Oto mój kodJak uzyskać status intencji menedżera pobierania do pomyślnego pobrania lub nie powiodło się

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; 
       }  
      } 

Ale stan DownloadManager nigdy skoczyć na DownloadManager.STATUS_SUCCESSFUL lub DownloadManager.STATUS_FAILED. Każda pomoc dla mnie?

Odpowiedz

4

Musisz zażądać menedżera pobierania. Kursor pozostaje taki sam, nawet jeśli dane ulegną zmianie. Wypróbuj w ten sposób:

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

pobierania plików Menedżer pobierania w sposób asynchroniczny. Więc nie ma potrzeby umieszczania menedżera pobierania wewnątrz Asyntask.

Możesz użyć Odbiornik, aby uzyskać status menedżera pobierania, jeśli pobieranie zostało zakończone.

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(); 
      } 
    } 
} 

nie zapomnij dodać odbiornik w Manifest

<receiver 
     android:name=".CheckDownloadComplete" 
     android:enabled="true" 
     android:exported="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
     </intent-filter> 
    </receiver> 
Powiązane problemy