2014-10-06 4 views
6

여기 내 문제가 있습니다. Asynctask를 통해 다운로드 관리자 인 텐트를 사용하여 내 서버에서 파일을 다운로드하려고합니다. asynctask 클래스의 doInBackground에 다운로드 관리자 인 텐트가 호출되었고 다운로드가 완료되면 (성공 또는 실패) doinBackground가 부울 값을 반환합니다. 다음은 내 코드다운로드 성공 또는 실패까지 다운로드 관리자의 의도 상태를받는 방법

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

이다 그러나 DownloadManager 상태 DownloadManager.STATUS_SUCCESSFUL 또는 DownloadManager.STATUS_FAILED에 뛰어하지 않습니다. 나를 도와 주시겠습니까?

답변

4

다운로드 관리자를 다시 쿼리해야합니다. 데이터가 변경 되더라도 커서는 그대로 유지됩니다. 다음과 같이 시도하십시오 :

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

다운로드 관리자 다운로드 파일에 아주 좋은 예가있다. 따라서 다운로드 관리자를 Asyntask에 넣을 필요가 없습니다.

다운로드가 완료되면 다운로드 관리자 상태를 얻으려면수신기를 사용할 수 있습니다.

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

망가

<receiver 
     android:name=".CheckDownloadComplete" 
     android:enabled="true" 
     android:exported="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
     </intent-filter> 
    </receiver> 
매니페스트를 수신기를 추가하는 것을 잊지