2014-01-12 72 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? –