2014-01-12 110 views
1

我創建了一個AsyncTask來上傳或下載我的Google雲端硬盤中的文件。Android如何停止/終止/取消媒體上傳或下載

這是我的代碼部分的示例上傳文件:

public class AsyncUpload extends AsyncTask<String, String, String>{ 

    Context c; 



    public AsyncUpload(Context c) { 
     super(); 
     this.c = c; 
    } 


    @Override 
    protected String doInBackground(String... params) { 



     try{ 

      // File's binary content 
      java.io.File fileContent = new java.io.File(localFilePath); 

      InputStreamContent mediaContent = new InputStreamContent(FileInfo.getMime(localFilePath), new BufferedInputStream(new FileInputStream(fileContent))); 
      mediaContent.setLength(fileContent.length()); 


      // File's metadata. 
      File body = new File(); 
      body.setTitle(fileContent.getName()); 
      body.setMimeType(FileInfo.getMime(localFilePath)); 

      if(parentId!=null){ 
       ParentReference parent = new ParentReference(); 
       parent.setId(parentId); 
       body.setParents(Arrays.asList(parent)); 
      } 


      Drive.Files.Insert request = drive.files().insert(body, mediaContent); 
      MediaHttpUploader uploader = request.getMediaHttpUploader(); 
      uploader.setDirectUploadEnabled(false); 
      uploader.setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE); 
      uploader.setProgressListener(mediaHttpUploaderProgressListener); 
      File file = request.execute(); 
      if (file != null) { 
       Log.i(TAG,"File Uploaded"); 
       isAttempt=false; 
       return file; 
      } 

     } catch (IOException e) { 
      Log.e(TAG,"IOEXCEPTION Message:\n"+e.getMessage()); 
     } 


     return null; 
    } 

} 

此代碼的工作完美,但我不知道如何阻止它,而一個文件被上傳(或與下載類似的代碼)!

請幫幫我!

非常感謝

+0

感謝@RohanKandwal,但那裏有什麼代碼來阻止下載/上傳,而他們正在工作? – Meroelyth

回答

2

試試這個: 第一調用取消方法上的AsyncTask

實例
findViewById(R.id.cancelButton).setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      mTask.cancel(true); 
     } 
    }); 

然後你需要添加檢查你的異步任務是否已被取消:

@Override 
    protected String doInBackground(String... params) { 

     try{ 
      // File's binary content 
      java.io.File fileContent = new java.io.File(localFilePath); 
      final FileInputStream fileStream = new FileInputStream(fileContent); 
      InputStreamContent mediaContent = new InputStreamContent(FileInfo.getMime(localFilePath), new BufferedInputStream(fileStream)); 

      .... 

      uploader.setProgressListener(new MediaHttpUploaderProgressListener() { 
       void progressChanged(MediaHttpUploader uploader) { 
        if(isCancelled()) { 
         // could not find another way to cancel transferring except that: 
         fileStream.close(); 
        } 
        else { 
         mediaHttpUploaderProgressListener(uploader); 
        } 
       } 
      }); 

      .... 

     } catch (IOException e) { 
      Log.e(TAG,"IOEXCEPTION Message:\n"+e.getMessage()); 
     } 

     return null; 
    } 

希望這會起作用。

必須添加以下內容 - 這不是「正確」的方式來實現傳輸操作。請記住,您的活動可能會停止,甚至被破壞,並且在任務正在工作時再次創建。 事件可能會發生更糟糕的事情。如果您的應用在前臺沒有任何活動,則在傳輸仍在繼續時,運行AsyncTask無法防止在系統內存不足時銷燬整個應用。在這種情況下,轉移甚至可能沒有完成。

考慮將轉移操作轉移到專用服務組件可能會更好。

+0

非常非常非常非常非常感謝!它完美的工作! 現在我正在使用此代碼服務!你是最好的! – Meroelyth

0

如果取消的AsyncTask那麼你的下載和上傳自動取消

if(mTask!=null) mTask.cancel(); 

感謝

+0

你必須檢查doInBackground內isCancelled並停止處理自己 –

+0

非常感謝,但我必須使用最後的代碼?請給我一個關於如何停止該過程(下載/上傳)的示例... – Meroelyth

+0

如何運行此AsyncUpload? –